1

我有以下 Selenium 脚本用于在 rediff.com 上打开警报:

public class TestC {
    public static void main(String[] args) throws InterruptedException, Exception {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();   
        driver.get("http://www.rediff.com/");
        driver.findElement(By.xpath("//*[@id='signin_info']/a[1]")).click();
        driver.findElement(By.id("btn_login")).click();
        Thread.sleep(5000);
        Alert alert=driver.switchTo().alert();
        alert.accept();
    }
}

这个相同的脚本在 Firefox 和 IE9 中运行良好,但是在打开警报后使用谷歌浏览器,其余代码不起作用。最主要的是,它没有显示任何异常、错误或任何东西。

请尽快提供任何解决方案。非常感谢!

注意:如果我们需要更改浏览器的任何设置或任何东西,请告诉我。

Selenium version:Selenium(2) Webdriver
OS:Windows 7
Browser:Chrome
Browser version:26.0.1410.64 m
4

2 回答 2

1

我很确定您的问题是一个非常常见的问题,这就是为什么我从不建议使用的原因Thread.sleep(),因为它不能保证代码只会在出现时运行Alert,而且即使显示警报,它也可能会增加您的测试时间.

下面的代码应该只等到页面上显示一些警报,我建议您也使用这个 Firefox 和 IE9。

public class TestC {
    public static void main(String[] args) throws InterruptedException, Exception {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();   
        WebDriverWait wait = new WebDriverWait(driver, 5);

        driver.get("http://www.rediff.com/");
        driver.findElement(By.xpath("//*[@id='signin_info']/a[1]")).click();
        driver.findElement(By.id("btn_login")).click();

        wait.until(ExpectedConditions.alertIsPresent());

        Alert alert = driver.switchTo().alert();
        alert.accept();
    }
}

大多数情况下,这里所做的一切都在改变Thread.sleep(),对于一个实际上只会在页面中出现 a 时才会在代码上前进的条件alert()。一旦有人这样做,它就会切换到它并接受。

您可以在此处找到整个ExpectedConditions课程的 Javadoc 。

于 2013-05-08T11:26:10.057 回答
0

不幸的是,C# API http://selenium.googlecode.com/git/docs/api/dotnet/index.html中不存在 AlertIsPresent

你可以使用这样的东西:

private static bool TryToAcceptAlert(this IWebDriver driver)
{
    try
    {
        var alert = driver.SwitchTo().Alert();
        alert.Accept();
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}


public static void AcceptAlert(this IWebDriver driver, int timeOutInSeconds = ElementTimeout)
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(timeOutInSeconds)).Until(
        delegate { return driver.TryToAcceptAlert(); }
        );
}
于 2013-05-09T10:50:44.590 回答