$(document).ready(function() {
try{
if(window.document.documentElement.getAttribute("webdriver"))
alert("Caught in the first case: Selenium Webdriver is banned!!!");
}
catch(Exception)
{
}
try{
if(navigator.webdriver)
alert("Caught in the second case: Selenium Webdriver is banned!!!");
}
catch(Exception)
{
}
});
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome,
args: ['--user-agent="Chrome under Selenium for Capybara"'] )
end
5条答案
按热度按时间guicsvcw1#
据我所知,Selenium并没有提供跨浏览器的方法来检测它是否在驱动浏览器。在Firefox中,webdriver会在
html
元素上设置webdriver
属性,但显然在其他浏览器中不会。也许有一天这会成为检测浏览器是否由Selenium驱动的 * 方法 *,但目前还不是。我刚刚在Firefox和Chrome上测试了它:该属性在Firefox中存在,但在Chrome中不存在。适用于任何浏览器、任何操作系统、任何测试运行程序的方法
有时候我需要做一些你想做的事情。我用Selenium运行大型测试套件。这些套件运行在多个版本的Chrome、Firefox和Internet Explorer上,运行在Linux、Windows和OS X上,其中一些测试在酱料Labs上远程运行。
我所使用的方法依赖于
executeScript
。(我链接到Java文档,但是这个方法存在于Selenium可用于的所有平台上。)我使用它在运行测试 * 之前 * 在浏览器端运行代码。我使用这个方法的两种方式:1.在
window
上设置一个变量browser-side,让我的浏览器代码检查。所以我可以设置window.running_test_suite_for_foobar = true
,然后让代码检查它。有冲突的风险,但如果小心使用变量名,风险是最小的。1.我使用的另一种方法是设计代码,使其具有配置选项或未记录的方法,这些方法可以被调用以在测试环境中正确设置或完全禁用它。例如,我有一个
onbeforeunload
模块,它可以防止用户离开一个带有未保存修改的页面。在测试中,通常打开这个模块是没有用的。Selenium * 可以 * 处理弹出窗口,但是当你远程运行测试时,每一点交互都有很大的代价。然后乘以几十个测试,然后你就有了一个测试套件,很容易就需要多花几分钟来运行。所以我有一个方法,我调用它来关闭它。
更改用户代理的问题
1.执行此操作的方法因浏览器而异。您的代码必须检查要运行的浏览器,然后根据浏览器执行正确的操作。
1.在其他答案中,Firefox和Chrome的方法 * 完全 * 替换了用户代理字符串(与一些人所说的相反)。要 * 追加 * 到它,你必须知道未修改的字符串是什么。这会随着浏览器和版本的不同而变化。
我猜你可能有一个用户代理字符串的表需要修改。这不是我想要维护的东西。或者你可以启动浏览器两次:一次是查询库存用户代理,另一次是使用修改后的用户代理运行测试。
当然,浏览器代码应该做 * 功能检测 * 而不是 * 浏览器检测 *,但在 * 某些情况下 *,知道代码必须处理特殊情况的唯一合理方法是知道它运行在哪个 * 版本 * 的浏览器中。
当问题是浏览器中的 bug 时,没有 * 功能 * 可供检查。检查bug是否发生可能代价太高,或者不可能可靠地完成。因此代码必须检查用户代理字符串。您的代码可能不必这样做,但第三方代码可以。(例如,我遇到了
getBoundingClientRect
的问题,在InternetExplorer中坐标通常不正确,但只在一个版本的Chrome中使用。在运行时检查bug的成本太高,而且我不能确定更改字体或显示设置是否会产生假阴性。)euoag5mw2#
由于问题中提到了水豚,下面是Ruby中的等效代码:
t3psigkw3#
是的,如果有人正在使用Firefox驱动程序进行Selenium自动化,您可以这样做,为了检测Selenium驱动程序,您必须在客户端放入以下代码:
对于Chrome和Internet Explorer特定的Selenium浏览器,它不工作。
hrirmatl4#
下面是如何用水豚和Chromedriver做到这一点:
pokxtpni5#
您可以尝试使用此answer禁用
navigator.webdriver
变量,但请注意,它不再来自ChromeDriver 79.0.3945.16及更高版本。