0

我遇到了一个问题,Selenium 说一个按钮即使在禁用时也是可点击的。

我将 Selenium 与一个网站一起使用,在该网站上,您必须先选择一个日期,然后从下拉列表中选择时间段,然后才能单击“预订”按钮并实际执行任何操作。在选择日期和时间段之前,按钮元素是

<div id="pt1:b2" class="x28o xfn p_AFDisabled p_AFTextOnly" style="width:300px;" _afrgrp="0" role="presentation"><a data-afr-fcs="false" class="xfp" aria-disabled="true" role="button"><span class="xfx">Book</span></a></div>

选择日期和时间段后,按钮变为

<div id="pt1:b2" class="x28o xfn p_AFTextOnly" style="width:300px;" _afrgrp="0" role="presentation"><a href="#" onclick="this.focus();return false" data-afr-fcs="true" class="xfp" role="button"><span class="xfx">Book</span></a></div>

我正在尝试使用此代码来等待按钮可点击

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, 'pt1:b2')))

但是 Selenium 表示,即使没有选择日期或时间段,并且该按钮完全变灰且无法点击,该按钮也几乎可以在网站加载后立即点击。我已经通过检查从导航到 url 之后和等待按钮可点击之后的时间戳来测试这一点,并且几乎没有延迟。我已经手动尝试了除循环之外的尝试并在两者之间休眠以能够成功单击按钮,但宁愿找出导致此问题的原因。有任何想法吗?

4

3 回答 3

0

element_to_be_clickable()

element_to_be_clickable是检查元素的期望是否可见并启用,以便您可以单击它。它被定义为:

def element_to_be_clickable(locator):
    """ An Expectation for checking an element is visible and enabled such that
    you can click it."""
    def _predicate(driver):
    element = visibility_of_element_located(locator)(driver)
    if element and element.is_enabled():
        return element
    else:
        return False

    return _predicate
    

现在,即使在没有选择日期或时间段的情况下加载网站时,p_AFDisabled属性值的存在决定了元素是启用还是禁用。接下来,当您填写日期或时间段时,类属性的值将删除,元素变为可点击p_AFDisabled

因此,理想情况下,要等待按钮可点击,您需要诱导WebDriverWait并且element_to_be_clickable()您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.p_AFTextOnly > a[onclick] > span.xfx"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'p_AFTextOnly')]/a[@onclick]/span[text()='Book']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
于 2020-12-09T19:04:56.557 回答
0

通过仅搜索要更改的类属性而不是 element_to_be_clickable 来解决此问题。

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class='x28o xfn p_AFTextOnly']")))
于 2020-07-02T09:51:08.893 回答
0

Selenium isclickable 检查 isdisplayed 并启用检查点击能力

isdisplay 检查样式属性,但 isenabled 检查禁用属性

现在 disable 在大多数情况下不是通过 html disable 属性处理,而是通过 javascript 和 css 类处理

所以可点击条件在这些情况下不起作用

https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html

所以在这种情况下,点击不会引发错误

https://github.com/SeleniumHQ/selenium/blob/trunk/py/selenium/common/exceptions.py

如果您检查异常类,您可以看到异常仅用于不可见,单击已拦截和未启用

于 2020-12-09T16:19:01.647 回答