我正在为我的公司自动化 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:
如果您想查看确切的页面,请转到 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()
您可以在以下位置找到一些详细的讨论:
- Message: Element could not be scrolled into view while trying to click on an option within a dropdown menu through Selenium
- org.openqa.selenium.ElementNotInteractableException: Element could not be scrolled into view when trying to click a button
作为替代方案,根据错误消息,要在调用 click()
之前滚动 Viewport 中的元素,您还可以使用 Element.scrollIntoView()方法。
您可以在以下位置找到详细讨论: - What is the difference between the different scroll options?
此时值得一提的是,以下方法:
- move_to_element()来自 selenium.webdriver.common.action_chains
- element_to_be_clickable()来自 selenium.webdriver.support.expected_conditions
将自动滚动 Viewport 中的元素。
您可以在以下位置找到详细讨论: - How to scroll a webpage using selenium webdriver in Python without using javascript method execute_script()
这个用例
文本为继续的按钮位于顶级内容中,但在模态对话框中呈现。
开发者工具快照:
由于所需的元素位于模态对话框中,因此要在该元素上定位并调用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
开发者工具快照:
关于python - Selenium python 错误: element could not be scrolled into view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085152/