【问题标题】:How to switch to iframe inside shadow dom with selenium如何使用 selenium 切换到 shadow dom 内的 iframe
【发布时间】:2020-11-23 06:37:48
【问题描述】:

测试中的应用程序基于 Electron(版本 9.1.1)编写为 Linux 桌面应用程序。 在电子中有自定义标签<webview>,即引用"The webview tag is essentially a custom element using shadow DOM to wrap an iframe element inside it."

我可以使用 Java selenim(版本 3.141.59)访问 shadow dom 并以 WebElement 的形式获取 iframe。

但是切换到 iframe 仍然让我处于父上下文中。

我的问题是:

如何在 SHADOW DOM 内切换到 IFRAME?

//getting webdriver
WebDriver driver = WebDriverRunner.getWebDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;

//acquire shadow dom WebElement 
WebElement shadowDom = (WebElement) js.executeScript("return arguments[0].shadowRoot", driver.findElement(By.tagName("webview")));

//acquire iframe WebElement 
WebElement iframe = shadowDom.findElement(By.tagName("iframe"));

//trying to swith to iframe inside shadow DOM, but still at parent context because can't find element that exist in iframe
driver.switchTo().frame(iframe);

//obviously produce NoSuchElementException
driver.findElement(By.xpath(".//label[text()='Columns']"));

这是页面的 HTML,我可以在 devtools 命令 document.querySelector('webview').openDevTools(); 中执行 webview 的 html,这就是为什么我确定 .//label[text()='Columns'] 存在。


UPD我正在通过暴露端口连接到电子应用程序,也许这是一种问题?

    public WebDriver createDriver(DesiredCapabilities desiredCapabilities) 

        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress", "localhost:8315");
        options.setAcceptInsecureCerts(true);
        options.merge(desiredCapabilities);

        return new ChromeDriver(options);
    }

【问题讨论】:

    标签: selenium iframe webview webdriver shadow-dom


    【解决方案1】:

    其实答案很简单。您只需明确声明您希望 webview 出现在窗口句柄列表中。

    这里是官方 chromedriver 文档link,功能名称是 windowTypes

    在java代码中会是这样的

    ChromeOptions options = new ChromeOptions();
    List<String> webview = Collections.singletonList("webview");
    options.setExperimentalOption("windowTypes", webview);
    
    WebDriver driver = new ChromeDriver(options);
    
    //after that you can just switch to is
    driver.switchTo().window("yourHandle");
    
    //and work with it as usual
    driver.findElement(By.xpath(".//label[text()='Columns']"));
    
    

    【讨论】:

    • 有没有办法切换到 iframe 中的窗口上下文,如果我没有 webview,只有 iframe 在 shadow root 内?
    • @lexigren 我认为代码 sn-p 有问题对您没有太大帮助?
    • @lexigren 看起来像 my question 中的代码 sn-p 应该对您有所帮助,因为标准做法是如何切换到 shadow-dom 内的 iframe
    猜你喜欢
    • 2019-01-08
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-11-14
    • 2021-06-19
    • 2020-03-02
    • 2018-01-15
    相关资源
    最近更新 更多