python - Selenium python 错误: element could not be scrolled into view

标签 python selenium firefox geckodriver webdriverwait

我正在为我的公司自动化 IdentiGO 应用程序,但我收到以下错误:

Internal Server Error: /identigo
Traceback (most recent call last):
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/maynard/employee/views.py", line 63, in post
    driver.main(employee)
  File "/Users/jane/Code/maynard_env/maynard/employee/driver.py", line 31, in main
    WebDriverWait(driver, 1000000).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: Element <span class="ui-button-text"> could not be scrolled into view

这是我的代码,省略了通往此页面的脚本,因为它们与我的问题无关。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


WebDriverWait(driver, 1000000).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()

On the page prior to this code, where the user selects an appointment date and time; I want the script to wait for the "Go" button to be pushed, then click on "Continue" in the following screenshot:

enter image description here

如果您想查看确切的页面,请转到 this url,那么您将必须使用以下信息发出一系列 POST 请求:

  • 点击安排新约会
  • 其他
  • 供应商和承包商( child )
  • tnvc00047
  • 37204
  • 随机安排约会

如有任何建议,我们将不胜感激!

更新

这是带有页面 html 的 JS Fiddle:

https://jsfiddle.net/khf4tym3/

当我点击“查看页面源代码”时,源代码中没有显示弹出的html,所以我认为它是用JS生成的。

<div class="ui-dialog-buttonset">
    <button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false">
        <span class="ui-button-text">Continue</span>
    </button>
</div>

更新2

如果我将行 WebDriverWait(driver, 1000000) 更改为 WebDriverWait(driver, 30),则会收到以下错误:

Internal Server Error: /identigo
Traceback (most recent call last):
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/maynard/employee/views.py", line 63, in post
    driver.main(employee)
  File "/Users/jane/Code/maynard_env/maynard/employee/driver.py", line 34, in main
    element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ui-dialog-buttonset']/button[@class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only']/span[contains(.,'Continue')]")))
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

pythonfiddle

到目前为止的项目代码,因此您可以跳过论坛条目。

https://jsfiddle.net/93k5s2xg/1/

工作解决方案:

WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//div[starts-with(@aria-describedby, 'ui-id-')]//span[@class='ui-button-text' and text()='Continue']"))).click()

最佳答案

这个错误信息...

selenium.common.exceptions.ElementNotInteractableException: Message: Element <span class="ui-button-text"> could not be scrolled into view

...暗示 WebDriver 实例,即 driver 无法滚动 Viewport 中的元素调用 click()


首先,由于您的用例是在元素上调用 click(),理想情况下您需要使用 ExpectedConditions 而不是使用 presence_of_element_located() 作为 element_to_be_clickable() 如下:

WebDriverWait(driver, 1000000).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()

您可以在以下位置找到一些详细的讨论:


作为替代方案,根据错误消息,要在调用 click() 之前滚动 Viewport 中的元素,您还可以使用 Element.scrollIntoView()方法。

您可以在以下位置找到详细讨论: - What is the difference between the different scroll options?


此时值得一提的是,以下方法:

将自动滚动 Viewport 中的元素。

您可以在以下位置找到详细讨论: - How to scroll a webpage using selenium webdriver in Python without using javascript method execute_script()


这个用例

文本为继续的按钮位于顶级内容中,但在模态对话框中呈现。

开发者工具快照:

ModalDialogBox

由于所需的元素位于模态对话框中,因此要在该元素上定位并调用click(),您必须引入WebDriverWait 对于 element_to_be_clickable(),您可以使用以下 Locator Strategy :

  • 使用 XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[starts-with(@aria-describedby, 'ui-id-')]//span[@class='ui-button-text' and text()='Continue']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

开发者工具快照:

XPath

关于python - Selenium python 错误: element could not be scrolled into view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085152/

相关文章:

java - 是否有基于 selenium 的 java api 构建器?

Selenium webdriver 验证一行中显示的文本

javascript - document.writeln 之后发出警报或 setTimeout

firefox - 如何更新自托管的 Firefox webExtension

html - Firefox box-shadow 表现不同

python - xgboost 中的泊松回归在低频时失败

python - 无法迭代列表 - Openpyxl

ios - 我在 mac 上使用 appium.app 如何打开多个 session 以使用不同端口运行

python - 动态过滤数据存储中的应用程序引擎数据

python - 属性错误: 'str' object has no attribute 'n' when using dateutil