Java Selenium:切换到在webview内部打开的shadow-root内部的iframe

时间:2018-08-01 09:09:09

标签: java selenium iframe webview shadow-dom

我正在尝试使用Java Selenium在我的节点webkit应用上自动化一些测试。它的工作方式是将chromedriver附加到主窗口,但是我访问的任何站点都以DOM形式作为Web视图出现在DOM中:

带有DOM的图片:

enter image description here

我将如何处理?在Java中扩展了影子根元素并尝试将上下文切换到其下面的iframe之后,我只是得到了与我正在调用的函数无关的随机错误(以我的观点)。例如:

WebElement shadowRoot = expandShadowElement(root);

WebElement iframe = shadowRoot.findElement(By.cssSelector("iframe"));
Driver.getWebDriver().switchTo().frame(iframe);

WebElement city = Driver.getWebDriver().findElement(By.className("input-btn-group"));

第二行给我一个“ isShown的参数必须是Element类型”,但这没有意义,因为我没有调用isShown函数。

3 个答案:

答案 0 :(得分:0)

根据您的问题,一旦扩展了阴影根元素,就会将所需<iframe> WebDriverWait 诱导为 frameToBeAvailableAndSwitchToIt ,如下所示:

WebElement shadow_root = Driver.getWebDriver().findElement(By.xpath("//webview[@class='sel' and contains(@src,'https://www.google.com/?')][starts-with(@id,'w_Webo')]"));
WebElement shadow_root_element = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", shadow_root);
new WebDriverWait(Driver.getWebDriver(), 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.tagName("iframe")));

注意:根据您共享的屏幕快照,标识为By.className("input-btn-group")的元素不可见,也不包含在答案中。

答案 1 :(得分:0)

我们可以按照以下3个步骤切换到Shadow Dow内部的iframe

步骤1:获取阴影根元素

第2步:使用该阴影根元素找到iframe网络元素

第3步:现在切换到第2步中获得的iframe

loc = Locator.new(:xpath,"//locator_used_to_get_shadow_root")
sr = @driver.gets_shadow_root(loc)

iframe_inside_shadowroot = sr.find_elements(:css, "iframe")

driver.switch_to.frame(iframe_inside_shadowroot)

答案 2 :(得分:0)

解决电子的类似问题。在电子产品中,他们在Webview的顶部有自己的包装器,该包装器基于Chromium Webview。

但是对于chrome webdriver解决方案来说可能是相同的。

https://stackoverflow.com/a/63227482/4577788