【问题标题】:selenium: wait for element to be clickable not working硒:等待元素可点击不起作用
【发布时间】:2017-08-12 18:52:37
【问题描述】:

我正在尝试使用 expected_conditions.element_to_be_clickable,但它似乎不起作用。在大约 30% 的运行中,我仍然看到“元素...无法点击”错误。

这是完整的错误信息:

selenium.common.exceptions.WebDriverException:消息:未知 错误:元素 ... 在点 (621, 337) 处不可点击。其他 元素会收到点击: ... (会话信息:chrome=60.0.3112.90) (驱动程序信息:chromedriver=2.26.436421(6c1a3ab469ad86fd49c8d97ede4a6b96a49ca5f6),平台=Mac OS X 10.12.6 x86_64)

这是我正在使用的代码:

def wait_for_element_to_be_clickable(selector, timeout=10):
  global driver
  wd_wait = WebDriverWait(driver, timeout)

  wd_wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)),
    'waiting for element to be clickable ' + selector)
  print ('WAITING')
  return driver.find_element_by_css_selector(selector)

更新:

所以现在这真的很奇怪。即使我添加了几个固定的等待期,它仍然偶尔会抛出错误消息。这是进行调用的代码:

  sleep(5)
  elem = utils.wait_for_element_to_be_clickable('button.ant-btn-primary')
  sleep(5)
  elem.click()

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    最终创建了我自己的自定义函数来处理异常并执行重试:

    """ custom clickable wait function that relies on exceptions. """
    def custom_wait_clickable_and_click(selector, attempts=5):
      count = 0
      while count < attempts:
        try:
          wait(1)
          # This will throw an exception if it times out, which is what we want.
          # We only want to start trying to click it once we've confirmed that
          # selenium thinks it's visible and clickable.
          elem = wait_for_element_to_be_clickable(selector)
          elem.click()
          return elem
    
        except WebDriverException as e:
          if ('is not clickable at point' in str(e)):
            print('Retrying clicking on button.')
            count = count + 1
          else:
            raise e
    
      raise TimeoutException('custom_wait_clickable timed out')
    

    【讨论】:

    • 你的函数工作!但我必须将 wait(1) 更改为 time.sleep(1)。你能解释一下 wait(1) 是从哪里来的吗?
    【解决方案2】:

    错误信息中说明了问题。

    元素 ... 在点 (621, 337) 处不可点击。其他元素会收到点击:...

    问题是某些元素(您从错误消息中删除的详细信息)阻碍了...位于您尝试单击的元素之上。在许多情况下,这是一些对话框或一些其他 UI 元素。如何处理这取决于情况。如果是打开的对话框,请将其关闭。如果它是您关闭的对话框但代码运行速度很快,请等待对话框的某些 UI 元素不可见(对话框已关闭且不再可见)然后尝试单击。一般只是读取阻塞元素的 HTML,在 DOM 中找到它,然后弄清楚如何等待它消失等等。

    【讨论】:

    • 人们会认为该函数在确定 isClickable 时会考虑到这一点。我最终创建了自己的函数来捕获异常并执行重试。
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2022-11-28
    • 2020-02-23
    • 2019-11-28
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多