C# 通过Selenium关闭代理身份验证弹出窗口

C# 通过Selenium关闭代理身份验证弹出窗口,c#,selenium,proxy,automation,C#,Selenium,Proxy,Automation,我在一个屏蔽社交媒体网站的地方工作,为那些(少数)有合法商业理由去社交媒体网站的人弹出一个代理登录。由于大多数网站都有Facebook、Twitter或类似的链接,代理提示会出现很多。当以正常的、人为驱动的方式浏览时,我只需按ESC键即可摆脱代理登录对话框。如何通过Selenium实现这一点?我看过很多关于关闭警报消息或模式对话的帖子和解决方案,但我没有看到任何关于关闭代理登录的帖子和解决方案;只是通过提供凭证绕过它 如有任何帮助/提示,将不胜感激。谢谢 规格: 我将Selenium 2.44与

我在一个屏蔽社交媒体网站的地方工作,为那些(少数)有合法商业理由去社交媒体网站的人弹出一个代理登录。由于大多数网站都有Facebook、Twitter或类似的链接,代理提示会出现很多。当以正常的、人为驱动的方式浏览时,我只需按ESC键即可摆脱代理登录对话框。如何通过Selenium实现这一点?我看过很多关于关闭警报消息或模式对话的帖子和解决方案,但我没有看到任何关于关闭代理登录的帖子和解决方案;只是通过提供凭证绕过它

如有任何帮助/提示,将不胜感激。谢谢

规格: 我将Selenium 2.44与C中的Firefox驱动程序一起使用#

编辑#2:有关此对话的更多信息)

此登录提示来自我们自己的内部代理服务器。我们的代理服务器基本上是在与远程站点进行任何通信之前询问用户是否拥有访问请求站点的权限。只要元素位于远程站点上,它就会弹出。例如,如果一个站点有一个Facebook和Twitter的按钮,该按钮从Facebook或Twitter本身拉出来,用户将看到两个代理登录提示。虽然页面的其他元素将在等待时加载,但页面加载过程最终会等待任何元素的响应,否则这些元素将被自动阻止

我解决这个问题的一个方法是将Firefox驱动程序与NoScript结合使用,并从白名单中删除所有社交网络链接。这是一个粗糙的解决方法,并强制使用一个浏览器。我正在寻找的是一种方法,让Selenium通过代码简单地关闭代理登录提示符(如果这样做的话)

编辑:添加屏幕截图示例)

编辑:添加了Inspect的屏幕截图)

像这样导航到网站:

WebDriver.Navigate().GoToUrl("http://username:password@website.com");
通常的网站是website.com

如果您不想登录,只需使用
操作
向驾驶员发送逃生钥匙即可:

var action = new Actions(WebDriver);
action.SendKeys(Keys.ESCAPE).Build().Perform();

按如下方式导航到网站:

WebDriver.Navigate().GoToUrl("http://username:password@website.com");
通常的网站是website.com

如果您不想登录,只需使用
操作
向驾驶员发送逃生钥匙即可:

var action = new Actions(WebDriver);
action.SendKeys(Keys.ESCAPE).Build().Perform();

不确定selenium,但可以使用
System.Windows.Automation
命名空间

  • “订阅顶级”窗口打开
  • 使用收到的
    AutomationElement
    检查它是否与您的Firefox窗口信息匹配(您可以使用类似take的检查来找出它们是什么)
  • 使用上面的
    AutomationElement
    订阅子窗口打开的事件
  • 在事件中,检查它是否是代理弹出窗口
  • 对其使用close方法或SendKeys发送ESC
  • 这是一个示例代码,您必须收集类名、自动化ID和窗口名称(请随意推荐,我将编辑答案):

    使用System.Linq;
    使用System.Text.RegularExpressions;
    使用System.Windows.Automation;
    命名空间FirefoxAutomation
    {
    类FirefoxAutomation
    {
    私有常量字符串FF_CLASSNAME=“MozillaWindowClass”/“Firefox CLASSNAME取自Inspect”;
    私有常量字符串FF_AUTOMATIONID=null;//“Firefox AUTOMATIONID取自Inspect”;
    private static readonly Regex FF_NAME=new Regex((-Mozilla Firefox)$”;//new Regex(“Firefox NAME Regex基于取自Inspect的名称”);
    private const string PROXY_CLASSNAME=“MozillaDialogClass”/“PROXY window CLASSNAME取自Inspect”;
    private const string PROXY_AUTOMATIONID=null;//“PROXY window AUTOMATIONID取自Inspect”;
    private static readonly Regex PROXY_NAME=new Regex(“^(需要身份验证)$”);//new Regex(“基于从Inspect获取的名称的代理窗口名称Regex”);
    公共FirefoxAutomation()
    {
    SubscribeTopLevelWindowOpened();
    }
    私有void SubscribeTopLevelWindowOpened()
    {
    Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent,
    AutomationElement.RootElement、TreeScope.Children、TopLevelWindow打开);
    }
    已打开private void TopLevelWindow(对象发送器,自动目标)
    {
    var元素=发送方作为AutomationElement;
    if(element==null)返回;
    //FireFox窗口元素的过滤器
    if(!MatchWindow(element,FF_CLASSNAME,FF_AUTOMATIONID,FF_NAME))返回;
    //订阅子窗口已打开
    Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent,
    元素,树镜。子元素,FirefoxChildWindow打开);
    }
    已打开私有void FirefoxChildWindow(对象发送器,AutomationEventArgs e)
    {
    var元素=发送方作为AutomationElement;
    if(element==null)返回;
    //筛选代理消息
    if(!MatchWindow(元素、代理\类名、代理\自动ID、代理\名称))返回;
    //找到“取消”按钮
    var controls=element.FindAll(TreeScope.Children,Condition.TrueCondition).Cast().ToList();
    var cancelButton=controls.FirstOrDefault(c=>c.Current.ControlType==ControlType.Button&&c.Current.Name==“取消”);
    如果(cancelButton==null)返回;
    //获得点击模式
    对象单击模式OBJ;
    如果(!cancelButton.TryGetCurrentPattern(InvokePattern.Pattern,out clickPatternObj))返回;
    ((InvokePattern)clickPatternObj.Invoke();//单击取消按钮
    }
    私有布尔匹配窗口(AutomationElement元素、字符串类名称、字符串automationId、正则表达式名称)
    {
    无功电流=元件电流;
    if(current.ControlType!=ControlType.Window)返回false;
    if(className!=nul