【问题标题】:Selenium WebDriver tests with JavaScript disabled禁用 JavaScript 的 Selenium WebDriver 测试
【发布时间】:2023-04-03 10:25:01
【问题描述】:

如果在浏览器中禁用 javascript(使用 noscript),我们的一个内部应用程序(用 angularjs 编写)会出现一个特殊的错误框,类似于 stackoverflow 上的错误框:

我正在尝试为它编写一个自动化测试,但遇到了困难。

我们使用的是protractor,但我很确定这与它无关。这是量角器配置文件:

'use strict';

var helper = require('./helper.js');

exports.config = {
    seleniumAddress: 'http://localhost:4444/wd/hub',
    baseUrl: 'http://localhost:9001',

    capabilities: helper.getFirefoxProfile(),

    framework: 'jasmine',
    allScriptsTimeout: 20000,

    jasmineNodeOpts: {
        showColors: true,
        isVerbose: true,
        includeStackTrace: true
    }
};

helper.js 在哪里:

var q = require('q');
var FirefoxProfile = require('firefox-profile');

exports.getFirefoxProfile = function() {
    var deferred = q.defer();

    var firefoxProfile = new FirefoxProfile();
    firefoxProfile.setPreference("javascript.enabled", false);
    firefoxProfile.encoded(function(encodedProfile) {
        var capabilities = {
            'browserName': 'firefox',
            'firefox_profile' : encodedProfile,
            'specs': [
                '*.spec.js'
            ]
        };
        deferred.resolve(capabilities);
    });

    return deferred.promise;
};

如您所见,我们将javascript.enabled firefox 首选项设置为false,如果您在firefox 中手动打开about:config,将其更改为false,您将看到@ 的内容。 987654337@部分。

但是,当我运行测试时,我收到以下错误:

抛出异常 org.openqa.selenium.WebDriverException: 等待 evaluate.js 加载失败

这里是complete traceback

仅供参考,使用 selenium 2.44.0 和 firefox 33.1.1

据我了解(在 here 提出的几点帮助下),禁用 javascript 正在扼杀 javascript webdriver 本身。这是真的吗?如果是,我有哪些选择或解决方法?


注意事项:

  • 如果是chrome,过去可以通过--disable-javascript command-line argument禁用javascript,但notanymore.

  • 这导致解决方法编号 0 - 将 chrome 降级到支持命令行标志的旧版本 - 这将是一个未经测试的计划 B

  • 设置javascript.enabled=false firefox 首选项适用于python selenium 绑定

    from selenium import webdriver
    
    profile = webdriver.FirefoxProfile()
    profile.set_preference('javascript.enabled', False)
    driver = webdriver.Firefox(firefox_profile=profile)
    
    driver.get('https://my_internal_url.com')
    # no errors and I can assert the error is present
    

我愿意接受任何建议,并可以为您提供任何其他信息。

【问题讨论】:

  • 您可以关闭 JavaScript 并且仍然让 Python 代码正常工作这一事实向我表明,关闭 JavaScript 并不会扼杀浏览器内部的 WebDriver 部分。您在禁用 JavaScript 时遇到的错误很可能是由 Protractor 本身或 WebDriverJS 引起的。
  • @Louis 我不知道你是怎么做到的,但你再次设法帮助了我,你的评论让我深入思考并触发了对源代码的挖掘。请看答案。谢谢。
  • 只是演绎推理,大量时间花在 Selenium 上。

标签: javascript firefox testing selenium-webdriver protractor


【解决方案1】:

这是实际发生的事情。

事实证明,在探索了protractor和selenium js webdriver的源代码之后,关键问题不在js webdriver或protractor,而是在我的测试编写方式上。

有一个名为ignoreSynchronization的设置,默认为false

  /**
   * If true, Protractor will not attempt to synchronize with the page before
   * performing actions. This can be harmful because Protractor will not wait
   * until $timeouts and $http calls have been processed, which can cause
   * tests to become flaky. This should be used only when necessary, such as
   * when a page continuously polls an API using $timeout.
   *
   * @type {boolean}
   */
  this.ignoreSynchronization = false;

而且我没有将其设置为true,这使得protractor 尝试与页面同步并执行evaluate.js 负责的客户端脚本。

解决方案非常简单,我无法想象 - 只需将 ignoreSynchronization 设置为 true 即可解决问题:

'use strict';

require('jasmine-expect');

describe('Disabled Javascript', function () {
    beforeEach(function () {
        browser.ignoreSynchronization = true;
        browser.get('index.html');
    });

    it('should show disabled js', function () {
        var element = browser.findElement(by.tagName('noscript'));
        expect(element.getText()).toEqual('Please enable Javascript and try again.');
    });
});

希望这对将来的某人有所帮助。

【讨论】:

    【解决方案2】:

    据我了解(借助此处提出的几点),禁用 javascript 正在杀死 javascript webdriver 本身。是真的吗?

    是的。请注意,WebDriver 本身作为 Firefox 扩展运行,因此它的代码不受您禁用 JavaScript 的影响。但是,错误消息表明 Selenium 正在尝试在网页的上下文中运行一些代码。为此,它将<script> 标签注入网页并将evaluate.js 的内容放入其中。然后它等待该脚本设置一个标志,表明它已准备就绪——这当然不会发生,因为脚本没有在该网页中运行。

    如果是,我有哪些选择或解决方法?

    重要的问题是 Selenium 试图在那里运行什么。您的回溯只是表明某些代码正在调用executeScript()executeAsyncScript()。我在 Selenium 代码库中找不到对这两种方法的任何隐含调用(至少在与 Firefox Web 驱动程序相关的任何文件中都没有)。鉴于 Selenium 是开源的,您应该能够对其进行调试并在 org.openqa.selenium.remote.RemoteWebDriver.executeScript()org.openqa.selenium.remote.RemoteWebDriver.executeAsyncScript() 上添加断点 - 这样您将实际看到正在执行的脚本。或者,您也可以重新编译RemoteWebDriver.java 并使其产生调试输出。

    查看这些方法是如何实现的,可能还有另一种方法:告诉 Selenium JavaScript 已禁用。这应该通过功能起作用:

    'javascriptEnabled': false,
    

    根据文档,此功能仅适用于 HTMLUnitDriver,但 Selenium 将始终考虑它,并且从源代码中为 Firefox 指定它似乎是可能的。有了这个功能,任何在网页上执行脚本的调用都会提前失败。

    【讨论】:

      【解决方案3】:

      根据您的堆栈跟踪,您似乎将 ff 33.1 与 selenium 2.43.1 一起使用,因此它不支持。请将您的 selenium 版本升级到 2.44 以启用对 ff-33 的测试。

      【讨论】:

      • 这可能是个问题,但将 selenium 更新为 2.44.0 - 问题仍然存在(更新了回溯)。谢谢。
      【解决方案4】:

      找到了替代解决方案/解决方法 - "NoScript Security Suite" firefox extension

      它会禁用每个域的 javascript,并且默认情况下,它会为除白名单中列出的所有站点执行此操作。这使得 webdriver 运行没有问题,打开一个网页,然后扩展禁用这个特定站点的 javascript,我看到了 noscript 标记的内容。

      这是量角器配置:

      'use strict';
      
      var helper = require('./disabledJavascript.helper.js');
      
      exports.config = {
          seleniumAddress: 'http://localhost:4444/wd/hub',
      
          capabilities: helper.getFirefoxProfile(),
          chromeOnly: false,
      
          specs: [
              'disabledJavascript.spec.js'
          ],
      
          framework: 'jasmine',
      
          allScriptsTimeout: 20000,
      
          baseUrl: 'http://localhost:9001',
      
          jasmineNodeOpts: {
              showColors: true,
              isVerbose: true,
              includeStackTrace: true
          }
      };
      

      其中disabledJavascript.helper.js 包含:

      'use strict';
      
      var q = require('q');
      var FirefoxProfile = require('firefox-profile');
      
      exports.getFirefoxProfile = function() {
          var deferred = q.defer();
          var firefoxProfile = new FirefoxProfile();
      
          firefoxProfile.addExtension('./test/e2e/disabledJavascript/noscript.xpi', function () {
              firefoxProfile.encoded(function(encodedProfile) {
                  var capabilities = {
                      'firefox_profile' : encodedProfile,
                      'browserName': 'firefox'
                  };
                  deferred.resolve(capabilities);
              });
          });
      
          return deferred.promise;
      };
      

      其中noscript.xpi 是下载的“Noscript”扩展。

      【讨论】:

      • 这个解决方案似乎否定了测试的意义,因为安装 NoScript 扩展与禁用 JavaScript 不同。行为差异确实非常显着。你没有回复我的建议,我猜javascriptEnabled这个能力没用?
      • @WladimirPalant 我同意禁用 javascript 的方式可能有所不同,您可能认为更多的是一种解决方法而不是真正的解决方案 - 尽管没有其他选项有效 - 我没有运气设置 @987654328 @preference,也可以使用 --disable-javascript chrome 选项和旧的 chrome 浏览器版本。谢谢。
      • 好吧,你仍然可以调试 Selenium - 这不是我能为你做的事情;)
      • @WladimirPalant 我害怕我会在那里找到什么:) (证明禁用 js 会影响 webdriver 启动脚本的运行)无论如何,我将奖励你的参与和多种选择。
      • @WladimirPalant 好的,我听从了你的建议并探索了源代码 - 问题解决了 :) Read the source, Luke - 你应该说 :)
      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多