Я хочу протестировать веб-приложение с инфраструктурой селена с использованием Java. Когда я тестирую приложение, используя Selenium с Chrome и Selenium с оболочкой Electron (как описано здесь: Тестирование приложения Electron с org.openqa.selenium в среде Java (Intellij) ), поведение между двумя решениямиотличается.
В частности, модальные предупреждения правильно закрываются с использованием Selenium с Chrome, но они так или иначе остаются открытыми с использованием Selenium с Electron. Когда я использую Selenium с Electron, они даже не кажутся модальными вообще - я могу просто вручную или программно взаимодействовать с остальной частью веб-приложения. Когда я открываю приложение Electron вручную, предупреждения становятся модальными.
Я использую следующий (очень экспериментальный) минимальный рабочий фрагмент кода Java для тестирования приложения (хотя я не могу поделиться подробностями относительно самого приложения, поскольку ононе принадлежит мне):
import java.util.List;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Test
{
private final WebDriver driver;
private final WebDriverWait wait;
public static void main(final String[] args)
{
final Test test = new Test();
test.execute();
}
public Test()
{
super();
this.driver = this.createChromeDriver();
this.wait = new WebDriverWait(this.driver, 5);
}
private WebDriver createChromeDriver()
{
System.setProperty("webdriver.chrome.driver", "[PATH_TO_CHROME_DRIVER]");
final ChromeOptions options = new ChromeOptions();
// I use this only when I work with Electron.
options.setBinary("[PATH_TO_ELECTRON_APPLICATION]");
final WebDriver driver = new ChromeDriver(options);
return driver;
}
private void execute()
{
// I use this only when I work with Chrome.
// this.driver.get("[URL_TO_WEB_APP]");
this.provokeAlerts();
this.wait(3000);
this.driver.quit();
}
private void provokeAlerts()
{
final By deleteLocator = By.xpath("[PATH_TO_DELETE_BUTTON]");
this.wait.until(ExpectedConditions.elementToBeClickable(deleteLocator));
final List<WebElement> deleteButtons = this.driver.findElements(deleteLocator);
this.clickOnFirstElement(this.driver, deleteButtons);
this.wait.until(ExpectedConditions.alertIsPresent());
final Alert alertForDismiss = this.driver.switchTo().alert();
alertForDismiss.dismiss(); // Electron doesn't close the alert, Chrome does. We can simply go on working, even though the dialog is modal.
this.wait.until(ExpectedConditions.elementToBeClickable(deleteLocator));
this.clickOnFirstElement(this.driver, deleteButtons);
this.wait.until(ExpectedConditions.alertIsPresent());
final Alert alertForAccept = this.driver.switchTo().alert();
alertForAccept.accept(); // Electron doesn't close the alert, Chrome does. We can simply go on working, even though the dialog is modal.
this.provokeAlerts();
}
private void clickOnFirstElement(final WebDriver driver, final List<WebElement> elements)
{
if (!elements.isEmpty())
{
this.clickOnElement(driver, elements.get(0));
}
}
private void clickOnElement(final WebDriver driver, final WebElement element)
{
if (this.isInteracteable(element))
{
final Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
}
}
private boolean isInteracteable(final WebElement element)
{
return element.isDisplayed() && element.isEnabled() && element.getSize().height > 0 && element.getSize().width > 0;
}
private void wait(final int milliseconds)
{
try
{
Thread.sleep(milliseconds);
}
catch (final InterruptedException e)
{
// ignore
}
}
}
Почему предупреждения не будут модальными в Selenium с Electron? Почему они остаются видимыми в этом случае, даже если я отклоняю или принимаю их? Это ошибка в моем коде или настройке?