C#Selenium或WebBrowser替代模仿人类

Sam*_*Sam 5 .net c# selenium-webdriver

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

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

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

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

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

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

Jim*_*ans 6

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

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

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

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


Mr.*_*Mr. 1

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

我已经使用 selenium、Watin 进行自动化,不幸的是它们确实干扰了你正在做的事情,而且我还没有找到解决这个问题的方法。

我也使用过 .NetWebBrowser类,但是为了自动化,我不确定它是否是一个功能齐全的 IE(关于在其中运行的 JavaScript)。我认为它确实执行 JavaScript,但你需要检查一下。

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

如果对您来说可行,这里是无头版本的列表:

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