Как переключиться на iframe внутри shadow dom с селеном - PullRequest
0 голосов
/ 03 августа 2020

Тестируемое приложение основано на Electron (версия 9.1.1), написанном как настольное приложение для Linux. В электронном есть собственный тег <webview>, который является цитатой «Тег webview по сути является настраиваемым элементом, использующим теневой DOM для обертывания внутри него элемента iframe.»

Я могу получить доступ к теневому dom и получить iframe как WebElement из него с помощью Java selenim (версия 3.141.59).

Но переключение на iframe все еще оставило меня в родительском контексте.

И мой вопрос:

КАК ПЕРЕКЛЮЧИТЬ К 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 страницы, и я могу получить html из webview при выполнении в команде devtools document.querySelector('webview').openDevTools(); Вот почему я уверен, что .//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);
    }

1 Ответ

1 голос
/ 03 августа 2020

На самом деле ответ был довольно простым. Вам просто нужно явно заявить, что вы хотите, чтобы веб-просмотр отображался в списке дескрипторов окон.

Вот официальные документы chromedriver ссылка и имя возможностей 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']"));

...