C# Selenium 或 WebBrowser 替代品模仿人类

标签 c# .net selenium-webdriver

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

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

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

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

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

我听说过 WaitN、GekoFX、MozNet 等,但根据我的阅读,我不确定这些是否可行。

最佳答案

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

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

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

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

关于C# Selenium 或 WebBrowser 替代品模仿人类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15063448/

相关文章:

java - 使用 webdriver 找不到元素

c# - 在发送传出请求之前将新的 SoapClient 绑定(bind)到特定的 IP 地址

c# - MVC 和 WebAPI 网站中的身份验证

c# - 是否可以在调试期间编辑 Razor 类库中的 Razor 页面 (.cshtml) 而无需重新启动?对比 2017

.net - WSMan PowerShell 提供商?

java - Debugger.Launch() 的 Java 等价物是什么?

c# - 如何从 SQL 查询返回动态对象

c# - 了解 Boyer Moor

javascript - Protractor 中的拖放操作

javascript - 如何使用 Watir 在网页上添加和执行 html2canvas