Обработка оповещений в селене - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь обработать предупреждение или фрейм, я не совсем уверен, является ли это предупреждением или фреймом.

Я вошел в Instagram, используя селен, используя следующий код:

driver.get('https://www.instagram.com/accounts/login/');
var username = driver.findElement(By.name("username", 10000));
username.sendKeys("username");
var password = driver.findElement(By.name("password", 10000));
password.sendKeys("password");
var login = driver.findElement(By.xpath("//button[@type='submit']", 5000));
login.click();

Теперь, после того, как это выполнится, и я войду в систему, я вижу ниже:

alert или Frame

Я делаю ниже, отключите это предупреждение

 function dismissAlert(){
    var alert = driver.switchTo().alert();
    console.log(alert.getText());
    alert.dismiss();
}

Но не удалось закрыть это предупреждение и вернуться в главное окно.Что не так я делаю здесь.

HTML-КОД ДЛЯ ВЫШЕ SS:

<div class="pbNvD fPMEg " role="dialog">
    <div class="piCib">
        <div class="dsJ8D">
            <div class="xlTJg">
                <div class="G3yoz">
                    <img height="76px" width="76px" src="/static/images/ico/xxhdpi_launcher.png/99cf3909d459.png" alt="">
                </div>
            </div>
        </div>
        <div class="_08v79">
            <h2 class="_7UhW9 x-6xq yUEEX KV-D4 uL8Hv">Turn on Notifications</h2>
            <div class="_7UhW9 xLCgt MMzan _0PwGv uL8Hv">Get notifications when you have new followers, likes or comments you may have missed.</div>
        </div>
        <div class="mt3GC">
            <button class="aOOlW bIiDR" tabindex="0">Turn On</button>
            <button class="aOOlW HoLwm" tabindex="0">Not Now</button>
        </div>
    </div>
</div>

Ответы [ 3 ]

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

К отклонить уведомление, которое необходимо нажать на <button> с текстом Не сейчас , которое не является ни Оповещением , ни внутри какого-либо iframe и вы можете использовать любое из следующих решений:

  • css:

    var login = driver.findElement(By.css("div[role='dialog'] button:nth-of-type(2)", 5000));
    login.click();
    
  • xpath:

    var login = driver.findElement(By.xpath("//div[@role='dialog']//following::button[2]", 5000));
    login.click();
    
0 голосов
/ 25 октября 2018

Это HTML-диалог, а не предупреждение.Вы можете сказать, щелкнув правой кнопкой мыши на диалоговом окне.Если вы получили контекстное меню и можете просмотреть HTML, вы знаете, что это не предупреждение.Чтобы проверить, находится ли он в IFRAME, вам нужно проверить диалоговое окно, а затем переместиться вверх по DOM.Если вы достигнете вершины DOM без прохождения через IFRAME, ваш диалог не будет отображаться в IFRAME.

У вас должна быть возможность нажимать любую из этих кнопок с помощью простого XPath, в зависимости от того, какую из них вы хотитечтобы щелкнуть:

//button[.='Turn On']
//button[.='Not Now']

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

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

При использовании javascript это может выглядеть следующим образом:

JavascriptExecutor js;
if (driver instanceof JavascriptExecutor) {
    js = (JavascriptExecutor)driver;
}
...
js.executeScript("document.querySelector('button.aOOlW.HoLwm').click()");
//Or
js.executeScript("document.querySelector('[role=\"dialog\"] button:nth-child(2)').click()");

При использовании java оно может выглядеть следующим образом:

driver.findElement(By.cssSelector(".aOOlW.HoLwm", 10000)).click();
//Or
driver.findElement(By.xpath("/div[@role='dialog']//button[.='Not Now']")).click();

Подождите, пока элемент будет виден:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement dialog = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.xpath("/div[@role='dialog']//button[.='Not Now']")));

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