如何在 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 的按钮