有没有办法从Javascript中检测到我在Selenium Webdriver页面中

时间:2010-09-01 01:37:15

标签: javascript selenium cucumber webdriver capybara

我想在我的测试中抑制TinyMCE的初始化,并且如果Javascript可以检测到我在Selenium自动化页面中运行,则可以轻松完成。

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

如果真的很重要,我会在Mac OS X上通过黄瓜和水豚来运行它。

6 个答案:

答案 0 :(得分:9)

据我所知,Selenium没有提供跨浏览器方法来检测它是否正在驱动浏览器。在FF中,webdriver在webdriver元素上设置html属性,但显然不在其他浏览器中。也许有一天,这将是 方式来检测浏览器是由Selenium驱动但现在不是。我刚刚用FF和Chrome测试过它:该属性存在于FF而不是Chrome中。那就是......

任何浏览器,任何操作系统,任何测试运行器的方法

有时候我需要做一些你想要达到的目标。我用Selenium运行大型测试套件。这些套件在Linux,Windows和OS X上运行Chrome,Firefox和IE的多个版本,其中一些测试在Sauce Labs上远程运行。

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

  1. window上设置我的浏览器代码检查的变量浏览器端。所以我可以设置window.running_test_suite_for_foobar = true,然后进行代码检查。存在冲突的风险,但如果谨慎使用变量名称,则风险很小。

  2. 我使用的另一种方法是设计我的代码,使其具有配置选项或未记录的方法,可以调用它们以便为测试环境正确设置或完全禁用它。例如,我有一个onbeforeunload模块,可防止用户离开未保存修改的页面。在测试中,通常打开它是没有用的。 Selenium 可以处理弹出窗口,但是当您远程运行测试时,每一点交互都会产生很大的成本。然后通过几十个测试多次,然后你有一个测试套件,可以轻松地再运行分钟。所以我有一个方法可以将其关闭。

  3. 更改用户代理的问题

    1. 执行此操作的方法因浏览器而异。您的代码必须检查您要运行的浏览器,然后根据浏览器执行正确的操作。

    2. 此处为其他答案显示的FF和Chrome的方法完全替换用户代理字符串(与某些人所说的相反)。要追加,它必须知道未修改的字符串是什么。这从浏览器更改为浏览器,版本更改为版本。我想你可以有一个库存用户代理字符串表来修改。这不是我想要维护的东西。或者您可以启动浏览器两次:一次查询股票用户代理,一次用修改后的用户代理运行测试。

      你不能对使用正确的用户代理字符串感到懒惰。虽然浏览器代码确实应该执行功能检测而不是浏览器检测,但仍然存在某些情况,其中唯一合理的方法是知道代码必须处理一个特例是通过知道它运行的浏览器的版本。当问题是浏览器中的 bug 时,没有功能来检查。检查错误是否发生可能成本太高或无法可靠地进行。所以代码必须检查用户代理字符串。您的代码可能不必这样做,但第三方代码可能。 (例如,我遇到了getBoundingClientRect发生的问题,其中坐标在IE中通常是不正确的,但只在Chrome的一个版本中。在运行时检查错误代价太高我不能确定更改字体或显示设置不会产生错误否定。)

答案 1 :(得分:2)

  1. 由于webbriver会自动播放普通浏览器(就像iMacros一样),因此您的网站无法直接检测到它。

  2. 您可以轻松地将字符串附加到useragent:

  3. 使用Firefox驱动程序很容易:

    FirefoxProfile profile = new FirefoxProfile();
    profile.addAdditionalPreference("general.useragent.override", "some UA string");
    WebDriver driver = new FirefoxDriver(profile);
    

答案 2 :(得分:2)

由于这个问题提到了Capybara,这里是Ruby中的等效代码:

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

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

答案 3 :(得分:1)

以下是与Capybara和Chromedriver合作的方法:

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

答案 4 :(得分:0)

是的,如果有人使用firefox驱动程序进行硒自动化,你可以这样做,为了检测硒驱动程序,你必须在客户端放下以下代码: -

$(document).ready(function() {
    try{

        if(window.document.documentElement.getAttribute("webdriver"))
            alert("Caught in 1st case :- Selenium Webdriver is banned!!!");
        }
        catch(Exception){}
     try{
        if(navigator.webdriver)
            alert("Caught in 2nd case :- Selenium Webdriver is banned!!!");
        }
        catch(Exception){}  

});

对于Chrome和IE特定的selenium浏览器,它无法正常工作。

答案 5 :(得分:0)

您可以尝试使用此answer来禁用navigator.webdriver变量,但是请注意,ChromeDriver 79.0.3945.16及更高版本中不再包含该变量。