首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试自动化与聚合物2穿透阴影多玛(/深/不推荐)

测试自动化与聚合物2穿透阴影多玛(/深/不推荐)
EN

Stack Overflow用户
提问于 2017-09-28 15:58:39
回答 2查看 674关注 0票数 6

目前,我的组织是在聚合物1与硒,量角器和摩卡,我们使用的阴影。对于验收测试,我们使用/deep/组合器来穿透DOM。对于聚合物2,/deep/组合器是不推荐的。

我的问题:在编写验收测试时,如果不推荐使用/deep/组合器,该如何穿透影子DOM

EN

回答 2

Stack Overflow用户

发布于 2019-04-14 12:48:40

在互联网上进行了大量的研究之后,我想出了一个解决方案,对我来说效果很好。

我遵循的步骤是:

  1. 使用工具查找JS路径。
  2. 创建一个字符串数组,其中包含所有需要的阴影,以遍历目标节点;3.可重用函数将返回将目标元素作为子元素的父元素。
  3. 使用目标元素的CSS路径执行操作。

见以下代码:

代码语言:javascript
复制
String[] shadowRootCalender = {"tickets-spa","tickets-config-page","#calendar"};
String date="2019-04-16";
FindShadowRootElement(driver, shadowRootCalender).findElement(By.cssSelector("wdat-date[slot='"+date+"']")).click();


public static WebElement FindShadowRootElement(WebDriver driver, String[] shadowRootSelector) {
    WebElement root = null;
    for(int i=0; i<shadowRootSelector.length; i++) {
        if(i==0) {
            isjQueryLoaded(driver);
            root = (WebElement)((JavascriptExecutor)driver).executeScript("return document.querySelector(arguments[1]).shadowRoot", root, shadowRootSelector[i]);
        }else {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            root = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].querySelector(arguments[1]).shadowRoot", root, shadowRootSelector[i]);
        }
    }
    return root;
}


public static void isjQueryLoaded(WebDriver driver) {
   // System.out.println("Waiting for ready state complete");
    (new WebDriverWait(driver, 30)).until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            String readyState = js.executeScript("return document.readyState").toString();
            //System.out.println("Ready State: " + readyState);
            return (Boolean) js.executeScript("return !!window.jQuery && window.jQuery.active == 0");
        }
    });
}       
票数 0
EN

Stack Overflow用户

发布于 2019-05-15 16:32:57

@Dilip Meghwal回答的简化版本:

代码语言:javascript
复制
public static WebElement pierceShadowRoot(String... selectors) {
    WebElement element = null;
    WebElement shadowRoot = null;
    for (String selector : selectors) {
        if (element == null) {
            element = getDriver().findElement(By.cssSelector(selector));
        } else {
            shadowRoot = (WebElement) getDriver().executeScript("return arguments[0].shadowRoot", element);
            element = (WebElement) shadowRoot.findElement(By.cssSelector(selector));
        }
    }
    return element;
}

举个例子,下面是我如何使用它来定位Google Chrome的清除缓存按钮,在这里,由于Chrome中使用的聚合物框架,其他方法无法工作:

代码语言:javascript
复制
WebElement targetElement = pierceShadowRoot("body > settings-ui", "#main", "settings-basic-page",
                "#advancedPage > settings-section:nth-child(1) > settings-privacy-page", "settings-clear-browsing-data-dialog",
                "#clearBrowsingDataConfirm");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46473567

复制
相关文章

相似问题

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