C# 使用Selenium和C在Firefox中查找并关闭对话框#

C# 使用Selenium和C在Firefox中查找并关闭对话框#,c#,selenium,modal-dialog,C#,Selenium,Modal Dialog,问题:我的selenium脚本无法识别并关闭当我重定向到包含要下载文件的URl时弹出的对话框。所附图像显示了我所指的对话框 我知道这个问题已经被问了一百万次,我花了至少24小时研究和尝试在网上发布的其他建议,但都没有成功。我希望附件中的图片也能澄清我指的是哪个Firefox对话框 我尝试了以下解决方案 1.正在创建IAlerts(未找到警报元素) 2.通过xpath尝试查找元素进行搜索(未找到要取消的xpath) 3.WindowsHandler方法(无法找出窗口名称) 在此方面的任何帮助都将不

问题:我的selenium脚本无法识别并关闭当我重定向到包含要下载文件的URl时弹出的对话框。所附图像显示了我所指的对话框

我知道这个问题已经被问了一百万次,我花了至少24小时研究和尝试在网上发布的其他建议,但都没有成功。我希望附件中的图片也能澄清我指的是哪个Firefox对话框

我尝试了以下解决方案
1.正在创建IAlerts(未找到警报元素)
2.通过xpath尝试查找元素进行搜索(未找到要取消的xpath)
3.WindowsHandler方法(无法找出窗口名称)

在此方面的任何帮助都将不胜感激。提前谢谢你


有几种类型的“弹出窗口”

  • Javascript对话框-这些不是HTML对话框,而是Javascript创建的对话框。它们包括
    alert()
    confirm()
    、和
    prompt()
    ,可以使用进行处理
  • HTML对话框-根据格式的不同,它们有不同的形式。如果右键单击该对话框并看到浏览器的典型上下文菜单,则它是一个HTML对话框。它们是当前页面DOM的一部分,因此您可以像访问任何其他页面一样使用Selenium来访问它(例如,不需要窗口句柄)
  • 浏览器窗口-这实际上是另一个弹出的浏览器窗口,可能看起来像一个对话框,具体取决于它的格式。它与HTML对话框不同,因为它可以移动到当前浏览器页面框架之外。您需要使用窗口句柄来访问这些窗口,就像在浏览器中使用另一个选项卡一样。一旦掌握了窗口句柄,就可以像访问任何其他页面一样访问该页面的HTML
  • 浏览器对话框-这些对话框有各种形式,但类似于系统对话框。它们不是由HTML组成的,因此Selenium无法访问它们。除了使用库访问它们之外,您还可以通过发送键(如
    等)以有限的方式与它们交互

  • 您所看到的是一个(4)浏览器对话框。根据您在其上执行操作的浏览器的不同,它们会采用不同的形式。你最好的做法可能是发送钥匙。有时,根据浏览器的不同,您可以指定将文件自动下载到特定位置的设置,以避免出现对话框。我从来没有用过这个,所以我不能指导你去那里。

    我可以通过检查对话框出现后打开的窗口数量来找到并关闭一个下载对话框。这个解决方案对我有效

    找到打开对话框的链接并单击它:

        var link = MyBrowser.Driver.FindElement(OpenQA.Selenium.By.Id("Button"));
    
        IJavaScriptExecutor js = driver as IJavaScriptExecutor;
        js.ExecuteScript("arguments[0].click();", link);
    
    在对话框打开后获取新窗口计数:

        var newWindowCount = MyBrowser.Driver.WindowHandles.Count;
    
    切换到新打开的对话框并将其关闭:

        MyBrowser.Driver.SwitchTo().Window(MyBrowser.Driver.WindowHandles[newWindowCount-1]);
    
        MyBrowser.Driver.Close();
    

    您需要使用
    sendKeys
    来处理该对话框。您可能需要通过窗口句柄切换到它(您不需要名称,只需在对话框出现之前记录现有句柄,并查看出现后添加的新句柄)。这里有很多选择:谢谢你的评论。我已经浏览了你分享的链接中的所有示例,但仍然无法识别该窗口。通过句柄循环无法识别对话框。窗口句柄列表只保存初始窗口,因此无法使用SendKeys方法将其分配给webelement。还有其他想法吗?欢迎来到Stack Overflow!虽然这段代码可以解决提问者的问题,但最好解释一下它是如何工作的——你可以通过修改答案来做到这一点。