处理硒中的警报

时间:2018-10-25 08:58:00

标签: javascript selenium-webdriver

我正在尝试处理警报或框架,我不确定是警报还是框架。

我使用以下代码使用硒登录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 or Frame

我在下面要做的是关闭此提醒

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

但是无法消除此警报并返回主窗口。 我在这里做什么错了。

高于SS的HTML代码:

<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 :(得分:1)

使用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();

答案 1 :(得分:0)

那是HTML对话框,而不是警报。您可以通过右键单击对话框来判断。如果获得上下文菜单并可以检查HTML,则说明它不是警报。要检查它是否在IFRAME中,您需要检查对话框,然后向上移动DOM。如果您未通过IFRAME而到达DOM的顶部,则您的对话框不在IFRAME中。

您应该能够使用简单的XPath单击这些按钮之一,具体取决于您要单击的按钮:

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

我建议您添加一个简短的等待元素可单击,因为有时对话框可能需要一段时间才能启动并完成加载。

答案 2 :(得分:-1)

关闭通知,您需要点击<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();