WebDriverWait 未按预期工作
Posted
技术标签:
【中文标题】WebDriverWait 未按预期工作【英文标题】:WebDriverWait not working as expected 【发布时间】:2018-09-21 08:44:28 【问题描述】:我正在使用 selenium 来抓取一些数据。
我点击的页面上有一个按钮说“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()
【问题讨论】:
只是评论WebDriverWait
的第二个参数不是“延迟”,而是“超时”。
【参考方案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)))
更新
根据您在 cmets 中的反问题,这里是三种方法的详细信息:
presence_of_element_located
presence_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.
【讨论】:
你能解释一下为什么它可以工作,但其他功能不行。element_to_be_clickable()
肯定有帮助,但在那之后我仍然遇到.click()
失败的情况。在element_to_be_clickable()
和.click()
之间添加time.sleep(1)
似乎可以解决问题。以上是关于WebDriverWait 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作