大家好,我前段时间使用Selenium来创建一个程序,在我喜欢的网站上执行自动化操作。
我设法使用Selenium做我想做的事,没有太多麻烦,我在后台使用它的唯一问题。
如果不影响我在PC上做的其他事情,我就无法使用它,我确实想过使用虚拟机,但我想尝试避免这种情况。
昨晚我在C#中使用WebBrowser类,它很好但有限,我喜欢它是如何在Windows窗体应用程序中自包含所以这就是我要找的东西。
任何人都知道在Windows窗体应用程序中集成浏览器的可视化表示的最佳方法,但仍允许我模仿键入等,但会在后台运行。
我听说过WaitN,GekoFX,MozNet等等,但从我读到的内容来看,我不确定这些内容是否有效。
答案 0 :(得分:6)
通常,当您尝试使用浏览器自动化网页时,您有两种模拟用户事件的选项。您可以通过JavaScript模拟它们,也可以使用操作系统级机制(所谓的“本机事件”)来模拟鼠标和键盘事件。这两种方法都存在缺陷。
仅使用JavaScript模拟事件可能会使窗口自动保留在后台,无需系统关注,同时执行您想要的任务。 Selenium RC使用了这种方法,Selenium WebDriver提供了为Firefox和IE使用模拟事件的功能。但是,这种方法存在一些缺点。模拟事件可能缺乏您所需的保真度和准确性。例如,通过CSS :hover
伪选择器工作的页面上的“下拉菜单”无法通过JavaScript触发,因此这种方法在这些情况下注定要失败。此外,由于您使用的是JavaScript,因此您只能使用JavaScript沙箱,这意味着跨域框架等可能严格超出范围。
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?
以下是无头版本的列表,如果这对你可行: