У меня есть сценарий для нажатия гиперссылки, и я открою новую вкладку (активное окно переместится на новую вкладку после нажатия гиперссылки)
Когда я пытаюсь перейти на веб-драйвер на новую вкладку, используя метод switchTo()
, затем браузер WebDriverWait.until
автоматически закрывается с ошибкой
org.openqa.selenium.WebDriverException: unknown error: cannot determine loading status
from no such execution context
(Session info: chrome=73.0.3683.103)
Я использую System.out.println(driver.getWindowHandle())
и вижу, что драйвер переходит на новую вкладку.
Как я могу исправить ошибку выше?
Я пытаюсь использовать итератор для цикла в windowHandle
Кажется, нельзя использовать WebDriverWait.until (ExpectedConditions) для ожидания новой вкладки.
Всегда получаю ошибку cannot determine loading status from no such execution context
Странная вещь, я могу использовать Thread.sleep(1000)
.
Как я могу избежать использования Thread.sleep в этом случае?
Потому что неявное ожидание тоже не может работать
Рабочий код с Thread.sleep ()
public class MyCode {
private WebDriver driver;
private WebDriverWait wait;
@Test
public void openPrestaShopFromDemoWebsite() {
System.setProperty("webdriver.chrome.driver", "chromedriver");
ChromeOptions chromeOptions = new ChromeOptions()
.addArguments("--start-maximized", "--incognito");
driver = new ChromeDriver(chromeOptions);
driver.navigate().to("http://demo.prestashop.com");
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loadingMessage")));
driver.switchTo().frame("framelive");
String parentTab = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Ecommerce software by PrestaShop")).click();
Set<String> windowHandles = driver.getWindowHandles();
Iterator<String> it = windowHandles.iterator();
while (it.hasNext()) {
String newTab = it.next();
if (!parentTab.equals(newTab)) {
driver.switchTo().window(newTab);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
wait.until(ExpectedConditions.titleIs("Create and develop your business with PrestaShop"));
driver.close();
}
}
driver.switchTo().window(parentTab);
driver.switchTo().frame("framelive");
assertThat(driver.findElement(By.linkText("Personal info")).isDisplayed());
driver.quit();
}
}
Неработающий код (невозможно определить статус загрузки из такого контекста выполнения)
public class MyCode {
private WebDriver driver;
private WebDriverWait wait;
private WebElement element;
@Test
public void openPrestaShopFromDemoWebsite() {
System.setProperty("webdriver.chrome.driver", "chromedriver");
ChromeOptions chromeOptions = new ChromeOptions()
.addArguments("--start-maximized", "--incognito");
driver = new ChromeDriver(chromeOptions);
driver.navigate().to("http://demo.prestashop.com");
wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loadingMessage")));
driver.switchTo().frame("framelive");
String parentTab = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Ecommerce software by PrestaShop")).click();
Set<String> windowHandles = driver.getWindowHandles();
Iterator<String> it = windowHandles.iterator();
while (it.hasNext()) {
String newTab = it.next();
if (!parentTab.equals(newTab)) {
driver.switchTo().window(newTab);
wait.until(ExpectedConditions.titleIs("Create and develop your business with PrestaShop"));
driver.close();
}
}
driver.switchTo().window(parentTab);
driver.switchTo().frame("framelive");
assertThat(driver.findElement(By.linkText("Personal info")).isDisplayed());
driver.quit();
}
}