Selenium python 错误:元素无法滚动到视图中
- 2025-04-10 09:45:00
- admin 原创
- 19
问题描述:
我正在为我的公司自动化 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()
在此代码之前的页面上,用户选择预约日期和时间;我希望脚本等待“Go”按钮被按下,然后单击以下屏幕截图中的“Continue”:
如果您想查看确切的页面,请转到此网址,然后您必须使用以下信息发出一系列 POST 请求:
点击安排新约会
其他
供应商和承包商(儿童)
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()
解决方案 1:
此错误信息...
selenium.common.exceptions.ElementNotInteractableException: Message: Element <span class="ui-button-text"> could not be scrolled into view
...意味着WebDriver实例,即驱动程序无法滚动Viewport内的元素来调用click()
。
首先,由于您的用例是click()
在元素上调用,理想情况下,presence_of_element_located()
您不需要使用,而是需要使用ExpectedConditions,如下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()
您可以在以下位置找到一些详细的讨论:
消息:尝试通过 Selenium 单击下拉菜单中的选项时,元素无法滚动到视图中
org.openqa.selenium.ElementNotInteractableException:尝试单击按钮时,元素无法滚动到视图中
或者,根据错误消息,要在调用之前在Viewportclick()
中滚动元素,您也可以使用Element.scrollIntoView()方法。
您可以在以下位置找到详细的讨论: -不同的滚动选项之间有什么区别?
此时值得一提的是以下方法:
来自selenium.webdriver.common.action_chains的move_to_element()
来自selenium.webdriver.support.expected_conditions的element_to_be_clickable()
将自动滚动视口内的元素。
您可以在以下位置找到详细讨论: -如何在 Python 中使用 selenium webdriver 滚动网页,而不使用 javascript 方法 execute_script()
此用例
带有文本“继续”的按钮位于顶层内容中,但在模态对话框中呈现。
DevTools 快照:
由于所需元素位于模态对话框中,因此要定位和调用click()
该元素,您必须引发WebDriverWait,element_to_be_clickable()
并且可以使用以下定位器策略:
使用
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
DevTools 快照:
解决方案 2:
使用以下 xpath 并单击它。
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')]")))
element.click()
如果以上点击不起作用,请尝试下面的点击。
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')]")))
element.location_once_scrolled_into_view
element.click()
或者您可以使用 javascript 执行器来点击。
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')]")))
driver.execute_script("arguments[0].click();", element)
EDITED
尝试下面的代码,它单击继续按钮,其中有继续和取消按钮。一旦您单击继续,您将单击另一个继续按钮。我已经从计划应用程序更新了代码。
#Schedule appointment
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)
#click on continue button
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
#click on second continue button
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
编辑其余代码。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver=webdriver.Chrome()
driver.get("https://tn.ibtfingerprint.com/")
driver.maximize_window()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@name="IN_PublicMenuSelection"]/span[contains(.,"Schedule a New Appointment")]'))).click()
time.sleep(5)
select=Select(driver.find_element_by_id("varAgency"))
select.select_by_value("OTHR")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAgency"]/span[contains(.,"Go")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAppType')))
select=Select(element)
select.select_by_value("60")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAppType"][contains(.,"Go")]'))).click()
time.sleep(10)
driver.find_element_by_id("varORI").send_keys("tnvc00047")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectORI"][contains(.,"Go")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"yes")]'))).click()
elements=WebDriverWait(driver,40).until(expected_conditions.presence_of_all_elements_located((By.XPATH,'(//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')))
if(len(elements)>0):
element=driver.find_element_by_xpath('(//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')
element.location_once_scrolled_into_view
ActionChains(driver).move_to_element(element).click().perform()
elements[0].click()
driver.find_element_by_css_selector("div.fieldentity div").click()
driver.execute_script("arguments[0].click();",element)
element1=WebDriverWait(driver, 40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]')))
driver.execute_script("arguments[0].click();", element1)
time.sleep(10)
driver.find_element_by_name("IN_varLocZipCode").send_keys("37204")
WebDriverWait(driver,40).until(expected_conditions.presence_of_element_located((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]'))).click()
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)
time.sleep(10)
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
该代码在 Chrome 浏览器和 Windows 10 操作系统上运行良好。我已经测试了几次。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.webdriver.support.select import Select
driver=webdriver.Chrome()
driver.get("https://tn.ibtfingerprint.com/")
driver.maximize_window()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@name="IN_PublicMenuSelection"]/span[contains(.,"Schedule a New Appointment")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAgency')))
select=Select(element)
select.select_by_value("OTHR")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAgency"]/span[contains(.,"Go")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAppType')))
select=Select(element)
select.select_by_value("60")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAppType"][contains(.,"Go")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varORI'))).send_keys("tnvc00047")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectORI"][contains(.,"Go")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"yes")]'))).click()
elements=WebDriverWait(driver,40).until(expected_conditions.presence_of_all_elements_located((By.XPATH,'(//form[@id="cjisAcknowledgementForm"]//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')))
if(len(elements)>0):
element=driver.find_element_by_xpath('(//form[@id="cjisAcknowledgementForm"]//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')
driver.execute_script("arguments[0].click();",element)
element1=WebDriverWait(driver, 40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]')))
driver.execute_script("arguments[0].click();", element1)
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.NAME,'IN_varLocZipCode'))).send_keys("37204")
WebDriverWait(driver,40).until(expected_conditions.presence_of_element_located((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]'))).click()
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
解决方案 3:
如果有人仍然遇到此问题,我通过设置窗口大小解决了此问题。Java 中的示例:driver.manage().window().setSize(new Dimension(5120, 2880));
。
解决方案 4:
为了解决这个问题,我只需在我的 WebDriverManager 类中为所有测试添加以下行:
driver.manage().window().maximize();
解决方案 5:
我在 Perl 中遇到了同样的问题并通过以下方式解决了它:
$element->execute_script("arguments[0].scrollIntoView();");
sleep 2;
$element->click();
扫码咨询,免费领取项目管理大礼包!