【问题标题】:How to click javascript confirm dialogue box with selenium webdriver in C#如何在 C# 中单击带有 selenium webdriver 的 javascript 确认对话框
【发布时间】: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();

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

【问题讨论】:

    标签: c# javascript asp.net visual-studio-2010 selenium


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多