【问题标题】:emulating a browser programmatically in C# / .Net在 C# / .Net 中以编程方式模拟浏览器
【发布时间】:2013-06-20 13:53:55
【问题描述】:

我们希望自动化网站中的某些任务,例如让用户“登录”、执行某些功能、读取他们的帐户历史记录等。

我们已经尝试使用普通的 POST/GET 来模拟这一点,但问题是,例如对于“登录”,网站使用 javascript 代码来执行 AJAX 调用,并且还会生成一些随机令牌。

是否可以从字面上模拟网络浏览器?例如:

  • 访问“www.[test-website].com”
  • 填写这些 DOM 项
    • DOM 项目 'username' 填写 'testuser'
    • DOM 项 'password' 填写 'testpass'
    • 单击'按钮 DOM 项'btnSubmit'
  • 访问帐户历史记录
    • 读取 HTML(这样我们就可以解析每个不同历史项目的信息)
  • ...

上面可以翻译成下面的示例代码:

var browser = new Browser();
var pageHomepage = browser.Load("www.test-domain.com");
pageHomepage.DOM.GetField("username").SetValue("testUser");
pageHomepage.DOM.GetField("password").SetValue("testPass");
pageHomepage.DOM.GetField("btnSubmit").Click();
var pageAccountHistory = browser.Load("www.test-domain.com/account-history/");
var html = pageAccountHistory.GetHtml();
var historyItems = parseHistoryItems(html); 

【问题讨论】:

  • 尝试 Fiddler 来做这件事。

标签: c# .net browser automation emulation


【解决方案1】:

您可以在 C# 中使用例如 Selenium。有一个很好的教程:Data Driven Testing Using Selenium (webdriver) in C#

【讨论】:

  • 如果目标是使用 .NET,Selenium C# 绑定很好,或者您也可以将 Selenium 与 IronPython 一起使用。最近我更喜欢 IronPython 而不是 C# 在 .NET 中进行自动化 GUI/浏览器测试。
  • 本教程已过时,更好的是available here
【解决方案2】:

我建议在代码中实例化一个 WebBrowser 控件并使用此实例完成所有工作,但不要以任何形式显示它。我已经这样做了几次,效果很好。唯一的缺陷是它使用了 Internet Explorer ;-)

【讨论】:

    【解决方案3】:

    试试 JMeter,它对于自动执行 Web 请求也很不错,也非常普遍地用于网站的性能测试

    【讨论】:

      【解决方案4】:

      或者直接试试 System.Windows.Forms.WebBrowser,例如:

      this.webBrowser1.Navigate("http://games.powernet.com.ru/login");
      while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
           System.Windows.Forms.Application.DoEvents();
      HtmlDocument doc = webBrowser1.Document;
      HtmlElement elem1 = doc.GetElementById("login");
      elem1.Focus();
      elem1.InnerText = "login";
      HtmlElement elem2 = doc.GetElementById("pass");
      elem2.Focus();
      elem2.InnerText = "pass";
      

      【讨论】:

      • 你能模拟点击锚链接,它实际上包含javascript代码吗? (例如:<a href="javascript:alert('hello world');">Click here</a>
      • 是的,我可以: foreach (HtmlElement elem in doc.GetElementsByTagName("a")) { Console.WriteLine(elem.InnerHtml + "->" + elem.DomElement); elem.InvokeMember("点击"); }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2010-09-16
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多