Тестируемое приложение основано на 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);
}