2017-08-03 128 views
1

我有自动化场景,有时系统会返回JavaScript警报,有时根本不会。我不知道这是什么原因,可能是网络问题。我已经创建了警报处理程序是:如何在Selenium WebDriver中处理间歇性警报?

public boolean isAlertPresent() { 
    WebDriverWait wait = new WebDriverWait(driver, 5); 
    wait.until(ExpectedConditions.alertIsPresent()); 
    return true; 
} 

我在一步一个有时会出现调用此警报:

public WSSPage enterAndSearchContent(String title) throws InterruptedException { 
    waitForElementTextWithEnter(searchTextField, title); 
    while (isAlertPresent()){ 
     Alert alert = driver.switchTo().alert(); 
     alert.dismiss(); 
     break; 
    } 
    return PageFactory.initElements(driver, WSSPage.class); 
} 

问题是,当警报显示不出来,它会给我NoAlertPresentException,并且自动化结果将失败。如果通过移动到下一行不发生警报,​​我希望代码继续前进,在这种情况下,它只会返回PageFactory.initElements(driver, WSSPage.class); 您能帮我从中提供更好的代码吗? 非常感谢。

+0

你能考虑改变'而(isAlertPresent( ))'to'if(isAlertPresent())'?谢谢 – DebanjanB

+0

@DebanjanB我做到了。当没有警报时,它仍然会产生NoAlertException。 – ajsapr

+0

为什么你总是'返回true;'从'public boolean isAlertPresent()'?如果没有警报存在,我们可以返回'假'吗?尝试从'public boolean isAlertPresent()'返回'boolean'值。基于返回类型,我们将处理'enterAndSearchContent()'中的情况。谢谢 – DebanjanB

回答

1

JavascriptExecutor为你工作。请注意,您应该在点击调用警报的事件之前执行它。

((JavascriptExecutor) driver).executeScript("window.confirm = function(msg) { return true; }"); 

注意: - 请勿在点击调用警报确认框的事件后使用它。以上内容由默认代码设定的确认框作为真正意味着你接受/点击确定所有的确认对话框,网页上如果调用

希望它会帮助你:)

+0

哇......这对我很有用。我甚至不需要再使用警报处理程序。非常感谢! – ajsapr

+0

我认为它适合你。感谢您接受答案。请投票了..它会真的帮助我和其他人谁将参考这个问题在未来:) –

+0

已upvote它,但可悲的是我没有足够的声誉公开显示在您的答案。再次感谢! – ajsapr

1

您可以修改下面给出的方法isAlertPresent并尝试。它可以帮助你。

public boolean isAlertPresent() { 
    try{ 
     WebDriverWait wait = new WebDriverWait(driver, 5); 
     wait.until(ExpectedConditions.alertIsPresent()); 
     return true; 
    } 
    catch (NoAlertPresentException noAlert) { 
     return false; 
    } 
    catch (TimeoutException timeOutEx){ 
     return false; 
    } 
} 
+0

它没有工作,我认为是因为'wait.until(ExpectedConditions.alertIsPresent());'会在没有警报时抛出异常。 – ajsapr

+0

通常情况下,预期条件会抛出超时异常。你可以试试这个。我已更新答案部分。 – Murthi

0

您可以在try catch中包含该特定异常。然后,异常将被捕获,并不会通过任何错误,您的执行将继续。 也创建一个隐含的等待,以较少的时间戳处理这个问题。

相关问题