使用聚合物2测试自动化穿透阴影dom(/深/弃用)

got*_*me4 6 selenium shadow-dom protractor polymer-2.x

目前,我的组织在聚合物1上使用Selenium,Protractor和Mocha,我们使用阴暗的dom.对于验收测试,我们使用/deep/组合器来刺穿DOM.对于聚合物2,/deep/组合剂不推荐使用.

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

小智 0

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

我遵循的步骤:

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

请看下面的代码:

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");
        }
    });
}       
Run Code Online (Sandbox Code Playgroud)