有没有办法检测I';我在JavaScript的SeleniumWebDriver页面中

有没有办法检测I';我在JavaScript的SeleniumWebDriver页面中,javascript,selenium,cucumber,webdriver,capybara,Javascript,Selenium,Cucumber,Webdriver,Capybara,我希望在我的测试中禁止初始化,如果JavaScript能够检测到我正在Selenium自动化页面中运行,那么可以轻松地完成这项工作 那么,是否有一些JavaScript代码可以用来检测Selenium驱动程序?或者,如何扩展userAgent字符串以包含可以从JavaScript检测到的模式 如果这真的很重要,我会在Mac OS X上运行它。因为问题提到了水豚,下面是Ruby中的等效代码: profile = Selenium::WebDriver::Firefox::Profile.new p

我希望在我的测试中禁止初始化,如果JavaScript能够检测到我正在Selenium自动化页面中运行,那么可以轻松地完成这项工作

那么,是否有一些JavaScript代码可以用来检测Selenium驱动程序?或者,如何扩展userAgent字符串以包含可以从JavaScript检测到的模式


如果这真的很重要,我会在Mac OS X上运行它。

因为问题提到了水豚,下面是Ruby中的等效代码:

profile = Selenium::WebDriver::Firefox::Profile.new
profile['general.useragent.override'] = "my ua string"

driver = Selenium::WebDriver.for :firefox, :profile => profile

以下是如何使用水豚和Chromedriver:

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome,
    args: ['--user-agent="Chrome under Selenium for Capybara"'] )
end

据我所知,Selenium没有提供跨浏览器方法来检测它是否在驱动浏览器。在Firefox中,webdriver在
html
元素上设置
webdriver
属性,但在其他浏览器中显然没有设置。也许有一天,这将是检测浏览器是否由Selenium驱动的一种方法,但目前还不是这样。我刚刚用Firefox和Chrome对其进行了测试:该属性在Firefox中存在,但在Chrome中不存在。那就是

用于任何浏览器、任何操作系统、任何测试运行程序的方法 有时候我需要做一些事情,比如你想要达到的目标。我使用Selenium运行大型测试套件。这些套件在多个版本的Chrome、Firefox和Internet Explorer上运行,在Linux、Windows和OS X上运行,其中一些测试在Sauce实验室上远程运行

我所使用的方法依赖于。(我正在链接到Java文档,但此方法适用于Selenium可用于的所有平台。)在运行测试之前,我使用它在浏览器端运行代码。我使用此方法的两种方式:

  • 在我的浏览器代码检查的
    窗口
    上设置一个可变浏览器侧。例如,我可以设置
    window.running\u test\u suite\u for\u foobar=true
    ,然后让代码检查它。存在冲突的风险,但如果小心使用变量名,风险最小

  • 我使用的另一种方法是设计代码,使其具有配置选项或未记录的方法,可以调用这些方法为测试环境正确设置代码或完全禁用代码。例如,我有一个
    onbeforeunload
    模块,它可以防止用户离开带有未保存修改的页面。在测试中,通常打开该选项是没有用的

  • Selenium可以处理弹出窗口,但是当您远程运行测试时,每一点交互都会有很大的成本。然后进行几十个测试,然后您就有了一个测试套件,可以很容易地多运行几分钟。所以我有一个方法,我调用它来关闭它

    更改用户代理的问题
  • 不同的浏览器执行此操作的方法不同。代码必须检查要运行的浏览器,然后根据浏览器执行正确的操作

  • 其他答案中显示的Firefox和Chrome方法完全取代了用户代理字符串(与一些人所说的相反)。要附加到它,您必须知道未修改的字符串是什么。这会随着浏览器和版本的不同而变化

    我想你可以修改一个股票用户代理字符串表。这不是我想要维持的东西。或者可以启动浏览器两次:一次查询股票用户代理,一次使用修改后的用户代理运行测试

    而且您不能懒惰地使用正确的用户代理字符串。虽然浏览器代码确实应该进行功能检测而不是浏览器检测,但在某些情况下,知道代码必须处理特殊情况的唯一合理方法是知道它运行在哪个版本的浏览器中

    当问题是浏览器中的错误时,没有要检查的功能。检查错误是否发生可能成本太高或无法可靠地执行。因此,代码必须检查用户代理字符串。您的代码可能不需要这样做,但第三方代码可能需要这样做。(例如,我在
    getBoundingClientRect
    中遇到了一个问题,在Internet Explorer中坐标通常是不正确的,但只有一个版本的Chrome。在运行时检查错误的成本太高,我无法确定字体或显示设置的更改是否不会产生误判。)


  • 是的,如果有人正在使用Firefox驱动程序进行Selenium自动化,您可以这样做,为了检测Selenium驱动程序,您必须在客户端输入以下代码:

    $(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)
        {
        }
    });
    

    对于特定于Chrome和Internet Explorer的浏览器,Selenium浏览器不起作用。

    您可以尝试禁用
    navigator.webdriver
    变量,但请注意,它不再来自ChromeDriver 79.0.3945.16及以上版本。

    我很清楚,您使用的是Selenium RC(Selenium 1.x)还是webdriver(Selenium 2.x)?这是selenium-Webdriver-0.0.28 gem中的Webdriver。谢谢,这非常适合Capybara场景。我们如何隐藏navigator.Webdriver变量?