【发布时间】:2019-12-13 11:54:21
【问题描述】:
最近在这里询问如何在 chrome 设置中定位元素:How to edit chromes search and homepage with selenium/python?
有人告诉我应该使用“shadow dom”元素,所以我继续想办法做到这一点。
我能够使用 shadow dom inception 成功定位 chrome 下载页面上的搜索字段,但是当应用几乎相同的逻辑/代码来定位 chrome://settings/ 上的特定页面或一组页面时,python返回错误
没有这样的元素:无法找到元素:{“method”:“css 选择器","选择器":"启动页面上的设置"}
我该如何解决这个问题?
Eduard Florinescu 评论道:“当您通常同时拥有动态内容和超过 3 个阴影元素时,自动化是不可能的。” 这里:How to handle elements inside Shadow DOM from Selenium
我希望有人可以在这里解释限制或解决方法?
这是用于在 Chrome 下载页面上定位搜索字段的示例代码
import selenium
from selenium import webdriver
driver = webdriver.Chrome("C:/Users/John/Desktop/Documents/selenium/webdrivers/chromedriver.exe")
#define inception function
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
#start doing inception
driver.get("chrome://downloads")
root1 = driver.find_element_by_tag_name('downloads-manager')
shadow_root1 = expand_shadow_element(root1)
root2 = shadow_root1.find_element_by_tag_name('downloads-toolbar')
shadow_root2 = expand_shadow_element(root2)
root3 = shadow_root2.find_element_by_tag_name('cr-toolbar')
shadow_root3 = expand_shadow_element(root3)
root4 = shadow_root3.find_element_by_css_selector("cr-toolbar-search-field")
shadow_root4 = expand_shadow_element(root4)
root5 = shadow_root4.find_element_by_id("searchInput")
root5.send_keys('test')
以下示例代码不适用于打开特定页面或一组页面单选按钮。
from selenium import webdriver
driver = webdriver.Chrome("C:/Users/John/Desktop/Documents/selenium/webdrivers/chromedriver.exe")
#define inception function
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
#start doing inception
driver.get("chrome://settings/")
root1 = driver.find_element_by_tag_name('settings-ui')
shadow_root1 = expand_shadow_element(root1)
root2 = shadow_root1.find_element_by_tag_name('settings-main')
shadow_root2 = expand_shadow_element(root2)
root3 = shadow_root2.find_element_by_tag_name('settings-basic-page')
shadow_root3 = expand_shadow_element(root3)
root4 = shadow_root3.find_element_by_css_selector("settings-section")
shadow_root4 = expand_shadow_element(root4)
root5 = shadow_root4.find_element_by_css_selector("settings-on-startup-page")
shadow_root5 = expand_shadow_element(root5)
root6 = shadow_root5.find_element_by_css_selector("settings-radio-group")
shadow_root6 = expand_shadow_element(root6)
root7 = shadow_root6.find_element_by_name("4")
root7.click()
如您所见,两个代码片段在语法和结构上几乎相同,但第二个不起作用。
C:\Users\John\Desktop\Documents\selenium\projects\startpage_domain_test\venv\Scripts\python.exe C:/Users/John/Desktop/Documents/selenium/projects/startpage_domain_test/startpage_domain_test.py
Traceback (most recent call last):
File "C:/Users/John/Desktop/Documents/selenium/projects/startpage_domain_test/startpage_domain_test.py", line 26, in <module>
root5 = shadow_root4.find_element_by_css_selector("settings-on-startup-page")
File "C:\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 430, in find_element_by_css_selector
return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
File "C:\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 659, in find_element
{"using": by, "value": value})['value']
File "C:\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"settings-on-startup-page"}
(Session info: chrome=75.0.3770.142)
Process finished with exit code 1
【问题讨论】:
标签: python windows selenium google-chrome