基于C#的测试自动化附加到现有浏览器

时间:2016-11-01 16:57:46

标签: c# .net selenium automation watin

C#,Visual Studio 2015,.NET 4.x Framework,Internet Explorer 11(或最新的Chrome),Windows 8.1 Pro工作站。

出于测试目的,使用用C#编写的Windows窗体或控制台应用程序,我需要自动化在Windows 8或10系统上运行的现有浏览器实例。

我创建了一个Windows窗体应用程序,并且我能够使用WebBrowser控件自动化我在应用程序中使用Navigate(...)方法的浏览器,并执行诸如单击Javascript弹出窗口中的按钮之类的操作,使用用户名和密码登录,从datagridview中选择一个项目,然后单击与该项目关联的“编辑”按钮。

但是,单击“编辑”按钮后,将创建其他浏览器窗口,这些窗口现在在WebBrowser控件的“范围”之外运行。

Web应用程序使用window.open(...,_blank);

打开浏览器的新实例

我尝试过使用NewWindow事件,但我似乎无法抓住任何类型的“句柄”或类似于新打开的窗口。事件触发,但是我在事件内部调试时看到的只是关于我正在使用的窗口的信息(而不是新生成的窗口)。

我尝试过的其他事情是SeleniumWatIn

对于这两个示例,我在www.google.com上的Windows 8.1 Pro工作站上运行了Internet Explorer 11实例。

通常,这些示例似乎表明,对于“附加到浏览器的现有实例”,示例首先触发浏览器。我试图使用这两个库连接到现有的浏览器,但我没有成功。

我尝试使用InternetExplorer驱动程序将RemoteWebDriver(...)用于Selenium。另一个Stack Overflow post表示我不需要运行服务器组件,因为用于测试的浏览器和应用程序位于同一台机器上。我的代码如下:

private void doSeleniumStuff()
{
    DesiredCapabilities desired = DesiredCapabilities.InternetExplorer();

    using (IWebDriver driver = new RemoteWebDriver(new Uri("http://www.google.com/wd/hub"), desired))
    {
        IWebElement query = driver.FindElement(By.Name("q"));
        query.SendKeys("Cheese");
        query.Submit();
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        wait.Until(d => d.Title.StartsWith("cheese", StringComparison.OrdinalIgnoreCase));
        Console.WriteLine("Page title is: " + driver.Title);
    }
}

我对RemoteWebDriver构造函数中使用的URL感到有些困惑。该文档似乎没有很好地描述这种用法。什么是“/ wd / hub”用法?

它错误地与:

{"Unexpected error. <!DOCTYPE html>\r\n<html lang=en>\r\n  <meta charset=utf-8>\r\n  <meta name=viewport content=\"initial-scale=1, minimum-scale=1, width=device-width\">\r\n  <title>Error 404 (Not Found)!!1</title>\r\n  <style>\r\n    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}\r\n  </style>\r\n  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>\r\n  <p><b>404.</b> <ins>That’s an error.</ins>\r\n  <p>The requested URL <code>/wd/hub/session</code> was not found on this server.  <ins>That’s all we know.</ins>\r\n"}

我尝试在WatIn中使用AttachTo(...)方法。

[STAThread]
private void doWatNStuff()
{
    using (IE myIE = Browser.AttachTo<IE>(Find.Any))
    {
        DomContainer dc = myIE.DomContainer;
    }
}

{/ 1}}

失败
  

{“无法找到符合约束的IE窗口:任何。搜索已过期   在'30'秒之后。“}

为WatIn提供的示例代码首先创建一个IE实例,然后附加到它。我不禁想到WatIn可以附加到正在运行的浏览器实例,但WatIn必须首先创建该实例。

这不符合我的需要。

我最后的尝试是使用using获取一个开放的Internet Explorer窗口并尝试使用它。当我进入窗口时,我可以访问的是System.Windows.AutomationWindows模式。因此,我可以自动调整浏览器窗口的大小并关闭它。但是,我无法获得DOM或任何有用的东西。

有一些关于使用Interop与MSHTML或SHDocVw的文章,但没有什么超级有用的。

我将不胜感激,任何人都可以提供任何指导,使用.NET C#Windows窗体或控制台应用程序可能使用的任何工具以某种方式连接到同一台Windows计算机上独立打开的浏览器窗口并自动化它。 / em>

1 个答案:

答案 0 :(得分:1)

我一直在成功使用WatiN。一个Program.cs的控制台应用程序看起来像下面这样适用于我:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using WatiN.Core;

namespace WatinTest
{
  class Program
  {
    [STAThread]
    static void Main(string[] args)
    {
      var ie = IE.AttachTo<IE>(Find.ByTitle(new Regex(".*")));
      foreach (var div in ie.Divs)
      {
        Console.WriteLine(div.IdOrName);
      }
      Console.ReadLine();
    }
  }
}

这适用于Windows 10和WatiN 2.1.0。