С Selenium python, нужно ли мне обновлять страницу, ожидая появления скрытого btn и быть интерактивным?

#python #selenium-webdriver #webdriverwait #expected-condition

#python #selenium-webdriver #webdriverwait #ожидаемое условие

Вопрос:

Я пытаюсь создать небольшую программу, которая просматривает веб-страницу по скрытой кнопке (использует hide в классе) и ожидает, пока она станет доступной для кликабельности, прежде чем нажимать на нее. Код приведен ниже. Мне интересно WebDriverWait element_to_be_clickable , будут ли функции and уже обновляться, или мне придется вручную обновлять страницу.

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.common.exceptions import WebDriverException

driver = webdriver.Firefox()
driver.get(<URL>)

print("beginning 120s wait")
time.sleep(120)
print("finished 120s wait")

try:
    element = WebDriverWait(driver, 1000).until(
        EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))

    )
    print("It went through")
    element.click()
    driver.execute_script("alert('It went through!');")
finally:
    driver.execute_script("alert('Did it work?');")
 

Прежде всего, я не совсем уверен, что простой поиск по имени класса за вычетом части «скрыть» действительно найдет правильный элемент, но большая проблема заключается в том, что я не знаю, будет ли кнопка видна только после обновления страницы. Если мне нужно обновить, это раздражает, потому что большинство сайтов выдают дополнительные captcha как для Firefox, так и для Chrome, когда они выясняют, что бот обращается к сайту. (Вот почему у меня начальный режим ожидания: чтобы я мог сначала завершить любую капчу вручную)

Итак, нужно ли мне обновлять мой код, или все будет хорошо без него? Если мне это нужно, как мне это реализовать? Мне просто добавить его как:

 try:
    element = WebDriverWait(driver, 1000).until(
        drive.refresh()
        EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))

    )
 

И извините, если на этот вопрос был дан ответ в другом месте, я искал кучу, но я не совсем нашел ответ на этом сайте.

Ответ №1:

Во-первых, вы не должны использовать sleep WebDriverWait с правильным EC , чтобы сделать трюк.

Что касается EC.element_to_be_clickable это код, лежащий в основе функции:

 def element_to_be_clickable(locator):
    """ An Expectation for checking an element is visible and enabled such that
    you can click it."""
    def _predicate(driver):
        element = visibility_of_element_located(locator)(driver)
        if element and element.is_enabled():
            return element
        else:
            return False

    return _predicate
 

Как вы можете видеть EC.element_to_be_clickable , функция не обновляет браузер.

Если вы настаиваете на необходимости обновления, правильным способом его реализации будет:

 try:
    element = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))

except (NoSuchElementException, StaleElementReferenceException):
    driver.refresh()
    element = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "btn add"))
 

Я не думаю, что обновление поможет со скрытым элементом…

Комментарии:

1. Итак, EC.element_to_be_clickable будет работать без обновления?

2. Да, сэр! element_to_be_clickable просто ждет X времени, пока элемент не станет полностью видимым, а затем он будет включен.

3. Хорошо, вот как я это понял, но, думаю, я не знаю, как на самом деле обновляются эти страницы. Если элемент / кнопка активируется, происходит ли это в реальном времени? Скажем, есть кнопка, выделенная серым цветом. Как интерфейсный разработчик меняет вещи, чтобы внести изменения в жизнь? Это «обновление» не требует обновления страницы для отображения, или оно просто внезапно появится на нашем конце? Кнопка, которую я жду, функционирует подобным образом. Я не думаю, что у него просто есть логика, которая диктует, что он ожидает условия в React или что-то в этом роде, хотя я могу ошибаться. Итак, включение кнопки может произойти без обновления?

4. @infinity8-room Обычно есть какая-то функция обратного вызова (или прослушиватель), которая активирует кнопку, например, если есть обязательные поля для заполнения, кнопка отправки будет отключена до тех пор, пока не будут заполнены все обязательные поля. В большинстве случаев не только обновление не сделает кнопку включенной, скорее вы потеряете условие для ее включения. Ожидание EC будет ждать, пока произойдет эта реакция. надеюсь, вы найдете это полезным…

5. Да, спасибо! Кнопка, о которой идет речь от меня, не будет активироваться в ответ на что-либо, что делает пользователь.