Selenium (PYTHON) нажимает на элемент, пока он больше не станет интерактивным

#python #selenium #click #webautomation

#python #selenium #нажмите #веб-автоматизация

Вопрос:

Итак, я создал программу, которая включает в себя весь XPATH элемента, и предполагается, что она будет продолжать щелкать по элементу, пока он больше не станет интерактивным, но, похоже, он не работает должным образом, что здесь не так?

 while True:

    try:
        driver.find_element_by_xpath("//*[@id='trades-container']/div/div[2]/div/div/div/div[1]/div[2]/div/div[2]/div[2]/ul/li[3]/a").click()
        print("item has been clicked")
    except TimeoutException:
        print("done clicking")
time.sleep(1)
 

Ответ №1:

Перехват ошибки, поскольку элемент больше не является интерактивным, как это, не кажется лучшей практикой. Вместо этого вы можете использовать две функции element.isDisplayed() и element.isEnabled() проверить, отображается ли элемент и доступен ли он в документе.

Взгляните на документацию для любых сомнений:

Однако, если вы хотите использовать исключения ошибок, вы можете следовать принципу EAFP и перехватывать исключение, вызываемое click() :

 from selenium.common.exceptions import WebDriverException

try:
    element.click()
except WebDriverException:
    print "Element is not clickable"
 

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

1. Хорошо, но что, если я хочу циклически щелкать, пока он больше не станет интерактивным?

2. Просто используйте цикл while, используя эти функции: while element.isDisplayed() and element.isEnabled(): #do stuff @ExoticLegend714

Ответ №2:

Я не уверен, почему вы, кроме тайм-аута, не используете ожидание ,

поскольку элемент отключен с помощью значения класса, используйте описанный выше метод

 classvalue=driver.find_element_by_xpath("//*[@id='trades-container']/div/div[2]/div/div/div/div[1]/div[2]/div/div[2]/div[2]/ul/li[3]/a").get_attribute("class")
 
 while "disable" not in classvalue:       
        driver.find_element_by_xpath("//*[@id='trades-container']/div/div[2]/div/div/div/div[1]/div[2]/div/div[2]/div[2]/ul/li[3]/a").click()
        print("item has been clicked")
        time.sleep(1)

 print("done clicking")
 

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

1. Я думаю, что формат и концепция, по крайней мере, лучше того, что вы написали, но элемент не доступен для просмотра, когда я его запускаю, он продолжает печатать «элемент был нажат», даже если элемент не доступен для просмотра, ни разу он не печатает «готово нажатие», что не так?

2. Когда он не доступен для просмотра, и вы пытаетесь щелкнуть его из скрипта, возникает какое-либо исключение?

3. он должен выбросить элемент, который не может взаимодействовать, если его отключенный элемент

4. да, когда он не доступен для просмотра, класс элемента изменяется на disabled

5. seelnium не обнаруживает класс, он обнаруживает отключение атрибута html