首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对selenium的Shadow-dom支持

对selenium的Shadow-dom支持
EN

Stack Overflow用户
提问于 2016-03-22 02:46:58
回答 7查看 13.6K关注 0票数 7

我正在做一个自动化项目,它广泛地使用了卷影DOMs。我使用execute_script函数来访问影子根元素。

例如:

代码语言:javascript
复制
root = driver.execute_script('return document.querySelector(".flex.vertical.layout").shadowRoot')

然后我使用根元素来访问其中的元素。由于我们在许多级别都有影子根元素,这让我很恼火。有没有更好的解决方案来访问卷影根元素中的元素?

我使用的是Chrome 2.20驱动程序。

EN

回答 7

Stack Overflow用户

发布于 2016-03-23 05:28:30

通过谷歌搜索,我找到了解决这个问题的另一种方法--使用"/deep/组合器“。

例如,我可以使用以下命令访问所有的阴影根元素

代码语言:javascript
复制
driver.find_elements_by_css_selector('body/deep/.layout.horizontal.center')

这将访问复合类名为layout horizontal center的元素,而不管它有多少影子根。

但这只适用于chromedriver,而/deep/是一种被弃用的方法。

票数 5
EN

Stack Overflow用户

发布于 2016-03-22 04:21:06

关于阴影DOM,WebDriver规范仍然是doesn't have anything specific to say

也不是Selenium project pages -这是可以理解的,因为它们严格遵循规范。然而,some low-level code是存在的。

因此,简短的回答是:不,目前在规范、Selenium的WebDriver应用程序接口或实现代码中没有特殊的支持。

是的,这个功能似乎存在于Chrome2.14中(作为ChromeDriver的一个包装器)。但是,据我所知,没有Selenium或WebDriver级别的绑定可以让您使用它。

但有关更多详细信息和可能的解决方法,请参阅:Accessing Shadow DOM tree with Selenium,也请参阅:Accessing elements in the shadow DOM,特别是:Finding elements in the shadow DOM

票数 2
EN

Stack Overflow用户

发布于 2017-11-27 22:40:21

为了在Chrome上实现自动化,我想出了一个不太优雅的解决方案:递归地搜索每个卷影dom,显式地使用:

代码语言:javascript
复制
driver.executeScript(scriptToRun, cssSelector);

下面是javascript (作为字符串传递):

代码语言:javascript
复制
function recursiveSearch(element, target) {
    let result = element.querySelector(target);
    if (result) { return result; }
    let subElements = element.querySelectorAll("*");
    for (let i = 0; i < subElements.length; i++) {
        let subElement = subElements[i];
        if (subElement && subElement.shadowRoot) {
            let result = recursiveSearch(subElement.shadowRoot, target);
            if (result) return result;
        }
    }
}
return recursiveSearch(document, arguments[0]);

由于shadowRoot的内容最初可能为空,因此可以使用driver.waituntil.elementIsVisible来避免返回空元素。

异步示例:

代码语言:javascript
复制
return await driver.wait(until.elementIsVisible(await driver.wait(async () => {
           return await driver.executeScript(scriptToRun, cssSelector);
       }, timeOut)));

另一个选择

我之前的解决方案是显式地使用阴影遍历元素,但自主性较差。与上面相同,但使用此脚本:

代码语言:javascript
复制
let element = document.querySelector(arguments[0][0]);
let selectors = arguments[0].slice(1);
for (i = 0; i < selectors.length; i++) {
    if (!element || !element.shadowRoot) {return false;}
        element = element.shadowRoot.querySelector(selectors[i]);
    }
return element;

其中selectors应该是这样的:

代码语言:javascript
复制
['parentElement1', 'parentElement2', 'targetElement']

附注

我发现在Firefox Quantum 57.0上运行我的自动化测试不会受到隐藏的阴影doms的影响,并且任何元素都可以用一个简单的:

代码语言:javascript
复制
driver.findElement(searchQuery);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36139212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档