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 未按预期工作

libgdx ScissorStack 未按预期工作

UICollectionViewLayout 未按预期工作

CollapsingToolbarLayout 未按预期工作

返回ObjectsAsFaults 未按预期工作