Как я могу нажать кнопку с Selenium во всплывающем окне? Пробовал различные методы безуспешно - PullRequest
0 голосов
/ 09 июля 2020

Я использую Selenium с Java для автоматизации процесса, который я выполняю на работе. Он проходит через сайт поставщика компьютеров и отправляет гарантийный запрос. У меня много проблем с нажатием кнопки «Закрыть» во всплывающем окне. Приглашение появляется не всегда, и оно генерируется с помощью javascript. На самом деле я написал, и это работало в Python, но я студент колледжа, и в моей программе получения степени используется java, поэтому я хотел переключить его. Я также использую Google Chrome и Chromedriver.

Любая помощь приветствуется, я хотел бы попробовать еще кое-что. Мой следующий шаг после всего, что ниже, - это действие по перемещению мыши к кнопке, но я еще не изучал это.

ОБНОВЛЕНИЕ: мой метод checkIfExistsByXpath был неправильным, И мне нужно было 2 se c Thread. Спать(). Метод должен был быть:

public boolean checkIfExistsByXpath(WebDriver driver, String xpath){
    try {
        driver.findElement(By.xpath(xpath));
    } catch (org.openqa.selenium.NoSuchElementException e){
        e.printStackTrace();
        return false;
    } return true;

Не то, что у меня внизу.

То, что я пробовал:

У кнопки нет идентификатора. Я попытался получить значение по xpath с ожиданием, это дает мне исключение NoSuchElement и говорит, что это не правильный xpath. Я трижды проверил xpath, и он скопирован прямо из источника, я получаю то же исключение, используя метод checkIfExistsByXpath Я сделал:

WebElement okButton = new WebDriverWait(driver, 30).until(
        ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"modalDuplicateDispatch\"]/div/div/div[3]/button")));
okButton.click();

Я попытался перевести поток в спящий режим (это сработало в Python), я также попробовал wait (5000):

Thread.sleep(5000);
WebElement okButton = new WebDriverWait(driver, 30).until(
        ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"modalDuplicateDispatch\"]/div/div/div[3]/button")));
okButton.click();

Я попытался получить все элементы из класса и щелкните их каждый в al oop, это дало мне исключение elementClickIntercepted, я также пробовал это с модальным классом:

    List<WebElement> buttonElements = driver.findElements(By.className("btn btn-primary"));
    for (WebElement buttonElement : buttonElements) {
        buttonElement.click();
    }

Я пытался проверить, было ли это предупреждение поле, он пропустил это прямо, поэтому я не думаю, что это окно предупреждения:

if (isAlertPresent)(driver){
        driver.switchTo().alert().accept();
}

if (isAlertPresent)(driver){
        driver.switchTo().alert().dismiss();
}

Я пытался использовать Javascript Executor, я не помню точный код в верхней части моего head, но это тоже не сработало.

Функции для проверки наличия всплывающего окна

public boolean isAlertPresent(WebDriver driver){
    try {
        driver.switchTo().alert();
        return true;
    }   // try
    catch (NoAlertPresentException Ex) {
        return false;
    }   // catch
}   // isAlertPresent()

public boolean checkIfExistsByXpath(WebDriver driver, String xpath){
    try {
        driver.findElement(By.xpath(xpath));
        return true;
    } catch (NoSuchElementException e){
        e.printStackTrace();
    } return false;

}

HTML Класс с веб-страницы

<div class="modal" id="commonNotificationModal" style="display: none;">
        <div class="modal-dialog fadeDown in" role="dialog" aria-hidden="true">
            <div class="modal-content">
                <div class="modal-header">
                    <button data-dismiss="modal" aria-label="Close" class="close" type="button">
                        <clr-icon aria-hidden="true" shape="close"></clr-icon>
                    </button>
                    <h3 class="modal-title"></h3>
                </div>
                <div class="modal-body">
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-primary" data-dismiss="modal">OK</button>
                </div>
            </div>
        </div>
    </div>

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Попробуйте более простой xpath - это generi c, и мы надеемся получить результат:

By.xpath("//button[text()='OK']")

Я знаю, вы говорите, что скопировали свой из python (где python сработало), но это смотрит прочь. Selenium сообщает, что его не нашли, поэтому не помешает попробовать что-то другое. Если вы получаете много совпадений, соответствующих xapth - попробуйте findelements, чтобы увидеть, подходят ли вам другие совпадения - тогда попробуйте сделать идентификатор менее универсальным c оттуда.

Я мог бы быть off, но у меня такое ощущение, что это двойные кавычки и escape-символ вокруг modalDuplicateDispatch. т.е. этот бит: (By.xpath("//*[@id=\"modalDuplicateDispatch\"]/

(я также не вижу modalDuplicateDispatch в исходном коде вашей веб-страницы, поэтому я предполагаю, что это на один уровень выше?)

Обычно я использую одинарные кавычки вокруг текст xpath. Я быстро осмотрелся:

java примеры идентификаторов - Java использование '' для строки xpath

python примеры идентификаторов - Python с использованием "" для строки xpath

.... Стоит попробовать?

0 голосов
/ 10 июля 2020

когда всплывающее окно появляется над родительским окном, вы должны обрабатывать окна в селене.

0 голосов
/ 09 июля 2020

Попробуйте этот метод

Driver.SwitchTo (). Frame («Fancybox-frame»);

Driver.findElement («введите свой xpath, чтобы закрыть всплывающее окно»). Click () ;

Driver.SwitchTo (). DefaultContent ();

...