在做web自动化的时候,一些元素在shadow-root的节点下,使得selenium中无法通过xpath来定位
shadowDOW
上面所看到的shadow-root标签其实就是一个shadowDOM,那么什么是shadowDOM呢?
他是前端的一种页面封装技术,可以将shadowDOM视为“DOM中的DOM”(可以看成一个隐藏的DOM)
他是一个独立的DOM树,具有自己的元素和样式,与原始文档DOM完全隔离。
shadowDOM必须附在一个HTML元素中,存放shadowDOM的元素,我们可以把它称为宿主元素。在HTML5中有很多的标签样式都是通过shadowDOM来实现的。
比如:日期选择框,音频播放标签,视频播放标签都自带了样式;(这种封装对于前端开发来说虽好,但是我们测试人员在做web自动给的时候就会遇到一些问题,shadowDOM中的标签无法定位。)
操作:
实现步骤:
1.先定位到shadow-root的宿主节点
2.在切换到shadow-root中
3.在选择shadow-root下的标签
js实现代码如下:
document.evaluate("//*[@id='app']/div/header/div[3]/div/div[1]/div/div/input", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value
selenium中通过js实现代码如下:
js ='''return document.evaluate("//*[@id='app']/div/header/div[3]/div/div[1]/div/div/input", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value'''
return self.driver.execute_script(js)