C#Selenium或WebBrowser替代模仿人类

时间:2013-02-25 09:09:18

标签: c# .net selenium-webdriver

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

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

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

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

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

我听说过WaitN,GekoFX,MozNet等等,但从我读到的内容来看,我不确定这些内容是否有效。

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

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

我使用了硒,Watin用于自动化,不幸的是它们确实干扰了你正在做的事情,我还没有找到解决方法。

我也使用过.Net WebBrowser类,但对于自动化,我不确定是否测试它是否是一个功能齐全的IE,关于在其中运行的JavaScript。我认为它确实执行了JavaScripts,但您需要检查。

如果你不需要看看发生了什么,那么也有无头的选择,即使对于Selenium,我认为: Is it possible to hide the browser in Selenium RC?

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

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