Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

selenium遇到shadow dom时定位元素



现在有一些页面在使用shadow dom了,比如视频或者表单,可以用作样式隔离等,类似iframe,但有些不一样。至于区别就不提了,这里只记录一下自动化测试时需要注意的地方。

首先原先的元素定义不管是xpath、id等都无法定位到该元素了,只要是被包裹在shadow-root中的元素。需要切换到shadow dom中。

比如可以看到类似下面的节点:

<form-shadow-root id='form-shadow-root'>
  #shadow-root (open)
    <div ...>
      <span ...>
      ...

其次即便切换到shadow dom中,目前已知issue是直接用xpath或tag name也是无法定位到该元素的。可以用css selector,也可以先用css找到父节点,然后再用find_element,这时可以用xpath。

# example
root = driver.find_element("id", "form-shadow-root")
shadow_root = root.shadow_root
textfield = shadow_root.find_element_by_css_selector("div#dialog > div:nth-child(2) input")  # id为dialog的div的下一级div的第二个,之后的相对的input tag(无所谓层级)
btn = shadow_root.find_element_by_css_selector("button[class='btn next-button']") # tag为button的class为该值的元素
dropdown_item = shadow_root.find_element_by_css_selector('#search-field').find_element_by_xpath("//div//ul/li[text()='default']")  # 先找css然后再找sub element

所以对于已有的脚本等,除了要记得切换进shadow dom,并且元素的定义基本都得换,封装的方法也得更新一些,这是需要注意的。

快速记录的可能比较潦草也许有笔误,后续有时间再来更新。

下一篇:  Django中新增unique request id
上一篇:  paddle在linux上识别返回不一致的问题

共有0条评论

添加评论

暂无评论