Sha*_*kar 5 html python selenium selenium-webdriver shadow-dom
我们正在使用 selenium web 驱动程序和 python 进行测试自动化,并尝试使用 shadow dom 设计自动化 html5 应用程序。无法识别 shadow-root 下的任何元素。例如。如果我想访问下面给出的影子根下的任何元素,那么我该怎么做?任何帮助表示赞赏。
Edu*_*scu 14
您可以注入执行此操作的这段 javascript,然后在该元素上运行 find_element 方法:
shadow_section = mydriver.execute_script('''return document.querySelector("neon-animatable").shadowRoot''')
shadow_section.find_element_by_css(".flex")
Run Code Online (Sandbox Code Playgroud)
因为你经常使用你可以创建一个函数,那么上面的就变成了:
def select_shadow_element_by_css_selector(selector):
running_script = 'return document.querySelector("%s").shadowRoot' % selector
element = driver.execute_script(running_script)
return element
shadow_section = select_shadow_element_by_css_selector("neon-animatable")
shadow_section.find_element_by_css(".flex")
Run Code Online (Sandbox Code Playgroud)
在结果元素上,您可以放置任何方法:
Run Code Online (Sandbox Code Playgroud)find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector查找多个元素(这些方法将返回一个列表):
Run Code Online (Sandbox Code Playgroud)find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
后来编辑:
多次嵌套根元素,第二个嵌套元素在文档中不再可用,但在当前访问的影子根中可用。我认为最好使用 selenium 选择器并注入脚本以获取影子根:
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
#the above becomes
shadow_section = expand_shadow_element(find_element_by_tag_name("neon-animatable"))
shadow_section.find_element_by_css(".flex")
Run Code Online (Sandbox Code Playgroud)
为了正确理解这一点,我刚刚在 Chrome 的下载页面中添加了一个可测试的示例,单击搜索按钮需要打开 3 个嵌套的阴影根元素:
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
selenium.__file__
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_css_selector('downloads-toolbar')
shadow_root2 = expand_shadow_element(root2)
root3 = shadow_root2.find_element_by_css_selector('cr-search-field')
shadow_root3 = expand_shadow_element(root3)
search_button = shadow_root3.find_element_by_css_selector("#search-button")
search_button.click()
Run Code Online (Sandbox Code Playgroud)