Почему предупреждения не являются модальными и закрыты в моем приложении Electron при тестировании с Selenium? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу протестировать веб-приложение с инфраструктурой селена с использованием 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? Почему они остаются видимыми в этом случае, даже если я отклоняю или принимаю их? Это ошибка в моем коде или настройке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...