目前,我的组织是在聚合物1与硒,量角器和摩卡,我们使用的阴影。对于验收测试,我们使用/deep/组合器来穿透DOM。对于聚合物2,/deep/组合器是不推荐的。
我的问题:在编写验收测试时,如果不推荐使用/deep/组合器,该如何穿透影子DOM?
发布于 2019-04-14 12:48:40
在互联网上进行了大量的研究之后,我想出了一个解决方案,对我来说效果很好。
我遵循的步骤是:
见以下代码:
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");
}
});
} 发布于 2019-05-15 16:32:57
@Dilip Meghwal回答的简化版本:
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中使用的聚合物框架,其他方法无法工作:
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");https://stackoverflow.com/questions/46473567
复制相似问题