EC.element_to_be_clickable 条件执行成功,但是在以下行中同一元素的单击失败

问题描述 投票:0回答:1

查询:如标题所述,如果以下行已成功执行:

element = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='See all teams']")))

为什么下面的行会抛出

Element is not clickable at point
异常?

element.click()

代码:

driver = webdriver.Chrome()
driver.get("https://useinsider.com/careers/")
driver.maximize_window()
wait = WebDriverWait(driver, 20)

# Accept cookies
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#wt-cli-accept-all-btn'))).click()

# Desired element is captured and printed successfully
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='See all teams']")))
print("The desired element's text:" + element.text)

# below line throws Element not clickable exception
element.click()

控制台输出/错误跟踪:

The desired element's text:See all teams
Traceback (most recent call last):
  File "C:\Users\username\PycharmProjects\pythonProject3\test1.py", line 19, in <module>
    element.click()
  File "C:\Users\username\PycharmProjects\pythonProject3\venv\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 93, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\username\PycharmProjects\pythonProject3\venv\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 403, in _execute
    return self._parent.execute(command, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\username\PycharmProjects\pythonProject3\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
  File "C:\Users\username\PycharmProjects\pythonProject3\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (759, 3145)
  (Session info: chrome=112.0.5615.138)

注意: 使用 JavaScript 或键盘事件单击所需元素都可以。

# Below both ways manage to click successfully
driver.execute_script("arguments[0].click();", element)
element.send_keys(Keys.ENTER)

为什么

element.click()
不起作用?
element_to_be_clickable
条件是否已经检查所需元素是否可点击,因此
element.click()
应该起作用?

python selenium-webdriver seleniumwaits element-to-be-clickable
1个回答
1
投票

这是一个常见的误解。

EC.element_to_be_clickable()
只是等待元素可见而不是禁用(想想输入)。它实际上并不会检查另一个元素是否覆盖了您尝试单击的元素,这就是您遇到的情况。

通常错误消息将包含拦截点击的元素的 HTML,但我在您的情况下没有看到它。只需运行脚本并查看您尝试单击的元素所在的位置以及覆盖它的元素即可。通常,它是以下几种情况之一:弹出对话框、出现一些过渡对话框,然后在几秒钟后消失、网站 UI 的某些部分(例如浮动页眉/页脚等)。元素,您可以将其关闭或滚动页面,使其不再覆盖该元素。

另一种选择是使用 JS 单击来单击被覆盖的元素,但只有在您不编写 UI 测试时才执行此操作,因为没有用户可以单击另一个元素*下*的元素。

e = driver.find_element(locator)
driver.execute_script("arguments[0].click();", e)
© www.soinside.com 2019 - 2024. All rights reserved.