Как принять оповещение в селене, который появляется в другом окне? - PullRequest
0 голосов
/ 20 сентября 2018

Сценарий: открыто 2 окна.Когда я нажимаю кнопку во втором окне, открывается третье окно, и фокус автоматически перемещается в третье окно.В 3-м окне появляется предупреждение для принятия.

Проблема: я не могу принять предупреждение, поскольку оно поступает в другом окне.

Выводы: я думаю, что это ограничение Selenium,Если предупреждение приходит в том же окне, где нажата кнопка, у нас есть DOM, поэтому мы можем взаимодействовать с предупреждением.Но в этом случае предупреждение находится в другом окне, поэтому состояние браузера заблокировано.

Пробное решение: опробованы все возможные способы с использованием javascript, класса действий selenium и т. Д., Но оно не работает.

некоторые из опробованных методов приведены ниже

//e.click();
                        /*Actions ac = new Actions(driver);

                        ac.sendKeys(Keys.ENTER).build().perform();*/
                        String onClickScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('click', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject){ arguments[0].fireEvent('onclick');}";
                        JavascriptExecutor jse = (JavascriptExecutor)driver;
                        jse.executeScript(onClickScript, e);

                    /*  Actions asd = new Actions(driver);
                        asd.clickAndHold(e).perform();
                        Thread.sleep(1000);
                        asd.release().perform();*/

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Приведенное ниже решение работает нормально и может использоваться в аналогичном сценарии.

Мы должны использовать класс Robot пакета java.awt.В приведенном ниже коде Alt + пробел + c закроет любое открытое окно.Здесь закрытие оповещения.

public void closeAlert(String strControlName, String delayTime) {
    Robot rb;
    int timeInSec = Integer.parseInt(delayTime);
    try {
        rb = new Robot();
        rb.keyPress(KeyEvent.VK_ENTER); //for clicking on the button or link
        rb.keyRelease(KeyEvent.VK_ENTER);
        Log.info("Wait for "+timeInSec+" Secs");
        Thread.sleep(timeInSec*1000);
        rb.keyPress(KeyEvent.VK_ALT); 
        rb.keyPress(KeyEvent.VK_SPACE);
        rb.keyPress(KeyEvent.VK_C);
        rb.keyRelease(KeyEvent.VK_C);
        rb.keyRelease(KeyEvent.VK_SPACE);
        rb.keyRelease(KeyEvent.VK_ALT); 
        Log.info("Successfully clicked on '"+strControlName+ "' and closed the Alert");
    } catch (Exception e) {
        Log.info("Failed click on '"+strControlName+ "' and close the Alert");
    }


}
0 голосов
/ 21 сентября 2018

Чтобы устранить некоторые сомнения, Alert генерируется с помощью JavaScript и никогда не является частью HTML DOM .

To принять или отклонить и Предупреждение Вы должны всегда вызывать WebDriverWait , чтобы предупреждение присутствовало следующим образом:

import org.openqa.selenium.Alert;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
//other code
Alert myAlert = new WebDriverWait(driver, 10).until(ExpectedConditions.alertIsPresent());
//accept an alert
myAlert.accept();
//dismiss an alert
myAlert.dismiss();
...