Selenium - 如何使用事件监听器处理弹出窗口(C#)

时间:2016-04-24 13:23:15

标签: c# selenium event-handling listener

我在C#中使用selenium(默认浏览器 - FireFoX)。

有些网站会在未知时间后弹出消息(如果有的话)。

我无法使用等待或睡眠,因为我不知道弹出窗口会出现在哪个屏幕上。使用' try-Catch'在每个页面上都不是很聪明....

我想到的解决方案是使用事件监听器来收听弹出窗口,然后它会点击' X'按钮。当然,侦听器必须位于Thread中,并且每个测试可能都有一个Threads数组,用于获取事件列表和xpath / ID。

有没有人做过这样的事情?是否有任何示例/文章/教程可以帮助我?

10X,

吉尔

2 个答案:

答案 0 :(得分:0)

考虑到一个古老的中国人proverb,当遇到这些问题时,我会去SeleniumHQ github存储库并查看tests

您希望您的等待时间很短,这样您就不会在没有警报时浪费太多时间等待。您可以在页面打开时或在测试离开该页面之前调用弹出处理代码;取决于您的应用程序的行为。

答案 1 :(得分:0)

我只是覆盖FirefoxDriver以自动接受警报并使警报异常静音:

class FirefoxDriverEx : FirefoxDriver {

    private static DesiredCapabilities Capabilities() {
        var capa = DesiredCapabilities.Firefox();
        capa.SetCapability(CapabilityType.UnexpectedAlertBehavior, "accept");
        return capa;
    }

    public FirefoxDriverEx()
        : base(Capabilities()) { }

    protected override Response Execute(string driverCommandToExecute, Dictionary<string, object> parameters) {
        try{
            return base.Execute(driverCommandToExecute, parameters);
        } catch (UnhandledAlertException) {
            return base.Execute(driverCommandToExecute, parameters);
        }
    }
}

以下是一个用法示例:

var driver = new FirefoxDriverEx();
driver.Navigate().GoToUrl("http://the-internet.herokuapp.com/javascript_alerts");
driver.FindElementByXPath("//button[.='Click for JS Alert']").Click();
string text = driver.FindElementById("result").Text;