WebDriverWait не работает должным образом

Я работаю с селеном, чтобы очистить некоторые данные.

На странице, которую я нажимаю, есть кнопка "custom_cols". Эта кнопка открывает для меня окно, в котором я могу выбрать свои столбцы.

Открытие этого нового окна иногда занимает некоторое время (около 5 секунд). Чтобы справиться с этим, я использовал

WebDriverWait 

с задержкой в ​​20 секунд. Но иногда не удается выбрать элементы поиска в новом окне, даже если элемент виден. Это происходит только один раз из десяти, в остальное время все работает нормально.

Я использовал ту же функцию (WebDriverWait) и в других местах, и она работает должным образом. Я имею в виду, что он ждет, пока элементы не станут видимыми, а затем щелкает по нему в тот момент, когда находит его.

Мой вопрос в том, почему элементы в новом окне не отображаются, хотя я жду, чтобы элемент стал видимым. Чтобы добавить сюда, я попытался увеличить время задержки, но все же время от времени получаю эту ошибку.

Мой код здесь

def wait_for_elem_xpath(self, delay = None, xpath = ""):
    if delay is None:
        delay = self.delay

    try:
        myElem = WebDriverWait(self.browser, delay).until(EC.presence_of_element_located((By.XPATH , xpath)))
    except TimeoutException:
        print ("xpath: Loading took too much time!")
    return myElem
select_all_performance = '//*[@id="mks"]/body/div[7]/div[2]/div/div/div/div/div[2]/div/div[2]/div[2]/div/div[1]/div[1]/section/header/div'
self.wait_for_elem_xpath(xpath = select_all_performance).click()

person Rao Sahab    schedule 11.04.2018    source источник


Ответы (1)


Как только вы дождетесь элемента и продвинетесь вперед, пытаясь вызвать метод click() вместо использования метода presence_of_element_located(), вам нужно использовать element_to_be_clickable() следующим образом:

try:
    myElem = WebDriverWait(self.browser, delay).until(EC.element_to_be_clickable((By.XPATH , xpath)))

Обновлять

В соответствии с вашим встречным вопросом в комментариях вот подробности трех методов:

присутствие_оф_элемента_расположено

Наличие_расположенного_элемента (указатель) определяется следующим образом:

class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)

Parameter : locator - used to find the element returns the WebElement once it is located

Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible or interactable (i.e. clickable). 

visibility_of_element_located

visibility_of_element_located (locator) определяется следующим образом:

class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)

Parameter : locator -  used to find the element returns the WebElement once it is located and visible

Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

element_to_be_clickable

element_to_be_clickable (locator) определяется следующим образом:

class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)

Parameter : locator - used to find the element returns the WebElement once it is visible, enabled and interactable (i.e. clickable).

Description : An Expectation for checking an element is visible, enabled and interactable such that you can click it. 
person DebanjanB    schedule 11.04.2018
comment
Не могли бы вы объяснить, почему он работает, а другие функции - нет. - person Rao Sahab; 11.04.2018