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

0vvn1miw  于 2022-11-29  发布在  Java
关注(0)|答案(5)|浏览(156)

我希望在测试中抑制TinyMCE的初始化,如果JavaScript可以检测到我正在Selenium自动化页面中运行,我可以很容易地做到这一点。
那么,是否有一些JavaScript代码可以用来检测Selenium驱动程序呢?或者,我如何扩展用户代理字符串以包含一个可以从JavaScript中检测到的模式呢?
如果这真的很重要的话,我会在MacOSX上通过CucumberCapybara运行这个程序。

guicsvcw

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的成本太高,而且我不能确定更改字体或显示设置是否会产生假阴性。)

euoag5mw

euoag5mw2#

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

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

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

t3psigkw3#

是的,如果有人正在使用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浏览器,它不工作。

hrirmatl

hrirmatl4#

下面是如何用水豚和Chromedriver做到这一点:

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

pokxtpni5#

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

相关问题