18910140161

Python-有人知道如何使用Selenium WebDriver识别影子DOM Web元素吗?-堆栈溢出

顺晟科技

2022-10-18 12:42:57

157

我们正在使用Selenium Web驱动程序和Python进行测试自动化,并尝试使用影子DOM设计来自动化HTML5应用程序。无法识别shadow-root下的任何元素。对于例如如果我想访问下面给出的影子根下的任何元素,那么我该怎么做呢?任何帮助都很感激。

enter image description here


顺晟科技:

您可以注入这段JavaScript来执行此操作,然后在该元素上运行查找_元素方法:

<代码>阴影_部分=mydriver.execute_脚本(' return document.queryselector(“ Neon-animatable ”).shadowroot ')阴影_部分。通过_CSS(“.flex ”)查找_元素_

由于你经常使用,你可能会创建一个函数,那么上面就变成了:

shadow_section = mydriver.execute_script('''return document.querySelector("neon-animatable").shadowRoot''')
shadow_section.find_element_by_css(".flex")

生成的元素上,您可以放置以下任何方法:

<块引用>
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")

要查找多个元素(这些方法将返回一个列表):

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

稍后编辑:

很多时候,根元素是嵌套的,第二个嵌套元素在文档中不再可用,但在当前访问的影子根中可用。我认为最好使用Selenium选择器并注入脚本来获取影子根:

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

这个角度来看,我刚刚在Chrome的下载页面中添加了一个可测试的示例,单击搜索按钮需要打开3个嵌套的影子根元素:

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")

你也

可以试试这种方式。

驱动程序.执行_脚本(' return document.queryselector(";neon-animatable";)。ShadowRoot.QuerySelector(";.flex";))

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航