如何在 C# 中单击带有 selenium webdriver 的 javascript 确认对话框

Posted

技术标签:

【中文标题】如何在 C# 中单击带有 selenium webdriver 的 javascript 确认对话框【英文标题】:How to click javascript confirm dialogue box with selenium webdriver in C# 【发布时间】:2012-04-23 00:43:08 【问题描述】:

我正在用 C# 编写 selenium 代码来与表单交互

这是提交按钮:

<input type="submit" value="Submit" onclick="return confirm('Submit?');" class="SubmitButton">

这是我点击提交按钮的 Selenium 代码。

IAlert alert = driver.SwitchTo().Alert();
alert.Accept();

但是,当我这样做时,没有单击“确定”按钮。相反,对话框消失了,表单就像提交输入从未被点击过一样。我做错了什么?

【问题讨论】:

【参考方案1】:

我不知道你的代码为什么不工作(我的版本是特定的),它对我来说工作正常。

IAlert alert = driver.SwitchTo().Alert();
alert.Accept();

任何方式,你也可以这样做,

SendKeys.SendWait("ENTER");

但在执行此操作之前,请确保在您的项目引用中添加“System.Windows.Forms.dll”,并确保您的应用在运行时处于活动状态,这意味着不要点击其他窗口当弹出窗口出现时,不要让您的计算机进入睡眠状态。

【讨论】:

只是想添加 IAlert alert = driver.SwitchTo().Alert();至少在 InternetExplorerWebDriver 中不起作用,这可能是因为 js cofirm alert 一旦启动就会阻止一切,你甚至不能在 c# 中执行下一行代码,这很奇怪。【参考方案2】:

这很丑,但是......我做什么我强制输入键进行警报并确认

【讨论】:

SendKeys.Send("ENTER");只需确保应用程序在运行时处于活动状态,如果是这种情况,它应该关闭警报窗口或确认确认 javascript……讨厌者会讨厌,但我们有一个巨大的通用 Web 测试器应用程序,它的工作原理就是这样…… 我尝试添加 alert.SendKeys("ENTER");它没有工作 你在调用哪个事件 SendKeys? 做一个快速测试,将 SendKeys 添加到 Times 的 Tick 事件中,然后看看会发生什么……然后你就可以确定你喜欢在哪里添加 Sendkeys。 我不知道你所说的事件是什么意思。我只是使用驱动程序切换到警报。 IAlert 警报 = driver.SwitchTo().Alert();然后 alert.SendKeys("ENTER");。我不知道将 sendkeys 添加到 tick 事件中意味着什么。【参考方案3】:

如果对话框从屏幕上消失。这意味着警报正在被抑制。您可以使用以下代码:

DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();

ieCapabilities.setCapability("unexpectedAlertBehaviour", "ignore");

WebDriver driver = new InternetExplorerDriver(ieCapabilities);

【讨论】:

这个只能和远程web驱动一起使用,你的回答让我很困惑【参考方案4】:

只是想补充一点,IAlert alert = driver.SwitchTo().Alert(); 至少在 InternetExplorerWebDriver 中不起作用,这可能是因为一旦启动 js cofirm alert 会阻塞所有内容,您甚至无法在 c# 中执行下一行代码,这很奇怪。

我要做的是在单独的线程中实际执行确认弹出窗口以释放 c# 后端中的控制,以便可以执行下一行代码,并且在发送之后和之前还必须执行 Thread.Sleep(1000)确保 js 仍然没有阻塞的关键

所以我的代码看起来是这样的:

public class MyThread
        
            public IWebDriver driver;
            public NgWebElement element;

            public MyThread(IWebDriver _driver, NgWebElement _el)
            
                driver = _driver;
                element= _el;

            

            public void RunMe()
            
                AsyncJavaScriptExecutor asyncJavaScriptExecutor = new AsyncJavaScriptExecutor(driver as IJavaScriptExecutor);

                asyncJavaScriptExecutor.ExecuteScript("arguments[0].click(); callback();", new object[]  element );
            
        

然后在测试或页面对象模型中

MyThread mthread = new MyThread(_driver, element);
            Thread oThread = new Thread(new ThreadStart(mthread.RunMe));
            oThread.Start();

            while (!oThread.IsAlive)


            //need to sleep beore and afer sending keys to makes sure js is not blicking events
            Thread.Sleep(1000);

            oThread.Abort();

            SendKeys.SendWait("ENTER");

            Thread.Sleep(1000);

【讨论】:

以上是关于如何在 C# 中单击带有 selenium webdriver 的 javascript 确认对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何错误处理 Selenium 无法单击元素,因为其他元素在 C# 中遮挡了它? [复制]

如何使用 jQuery 在 Selenium WebDriver 中单击带有 Java 的按钮

在 selenium 和 c# 中等待完成的下载文件

如何在Selenium中单击带有锚标记的图像或图标

Selenium C# Webdriver如何检测元素是不是可见

如何在selenium IDE中单击iFrame中的链接