5

大家好,我前段时间使用 Selenium 创建了一个程序来在我喜欢使用的网站上执行自动化操作。

我设法使用 Selenium 来做我以前想做的事,没有太多麻烦,唯一的问题是在后台使用它。

如果它不影响我在 PC 上做的其他事情,我就无法使用它,我确实想过使用虚拟机,但我想尽量避免这种情况。

昨晚我在玩 C# 中的 WebBrowser 类,它很好但有限,我喜欢它是如何在 Windows 窗体应用程序中自包含的,所以这就是我要找的。

剂量任何人都知道在 Windows 窗体应用程序中集成浏览器的视觉表示的最佳方式,但仍然允许我模仿键输入等,但会在后台运行。

我听说过 WaitN、GekoFX、MozNet 等,但从我所读到的内容中,我不确定这些是否可行。

4

2 回答 2

7

通常,当您尝试使用浏览器自动化网页时,您有两种选择来模拟用户事件。您可以通过 JavaScript 模拟它们,也可以使用操作系统级别的机制(所谓的“本机事件”)来模拟鼠标和键盘事件。这两种方法都有其缺陷。

仅使用 JavaScript 模拟事件可能会允许自动窗口保持在后台,无需系统焦点,同时执行您想要的任务。Selenium RC 使用了这种方法,而 Selenium WebDriver 提供了为 Firefox 和 IE 使用模拟事件的能力。但是,这种方法有一些缺点。模拟事件可能缺乏您需要的保真度和准确性。例如,通过 CSS 伪选择器工作的页面上的“下拉菜单”:hover无法通过 JavaScript 触发,因此这种方法在这些情况下注定会失败。此外,由于您使用的是 JavaScript,因此您被限制在 JavaScript 沙箱中,这意味着跨域框架等可能会严格超出范围。

另一方面,本机事件更能代表用户的实际鼠标和键盘操作。一般来说,它们会允许正确的事件以正确的顺序在网页上触发,而无需您猜测在哪些元素上触发哪些事件。使用它们的缺点是要正确实现它们,被自动化的窗口必须具有系统焦点才能正确接收事件。如果你在 Windows 上,你可以尝试使用SendMessageAPI 解决这个问题,但这是错误的做法,因为它容易出错并且绝对不能保证工作。使用原生事件的正确方法是使用SendInputAPI,但该 API 将输入发送到具有系统焦点的窗口。WebDriver 默认使用本地事件来模拟用户输入,但它默认使用有缺陷的SendMessage方法。至少对于 IE,它确实提供了使用更正确SendInput方法的选项。

如果您不希望在前台使用浏览器窗口,那么您真的应该考虑使用无头选项。PhantomJS是一个很好的选择,WebDriver 也有一个驱动程序,这意味着你仍然可以用 C# 编写你的自动化代码。否则,您只能使用上述其他方法之一。

于 2013-02-25T16:53:57.293 回答
1

应用程序是否需要托管在窗口中?

我已经使用 selenium,W​​atin 进行自动化,不幸的是它们确实干扰了你正在做的事情,我还没有设法解决这个问题。

我也使用过 .NetWebBrowser类,但是对于在其中运行的 JavaScript 而言,如果不测试它是否是一个功能齐全的 IE,我就不确定它是否是一个功能齐全的 IE。我认为它确实会执行 JavaScript,但您需要检查一下。

如果您不需要查看正在发生的事情,那么也有可用的无头选项,即使对于 Selenium,我认为: 是否可以在 Selenium RC 中隐藏浏览器?

如果这对您可行,以下是无头版本的列表:

https://gist.github.com/evandrix/3694955

于 2013-02-25T09:21:51.777 回答