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()
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)))
Обновить
Согласно вашему встречному вопросу в комментариях, здесь приведены подробности трех методов:
presence_of_element_located
sence_of_element_located(locator) определяется следующим образом:
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.