Selenium WebDriver测试禁用JavaScript

我们的一个内部应用程序(用angularjs编写)有一个特殊的错误框,如果在浏览器中禁用了javascript(使用noscript ),类似于在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 ,如果你手动打开about:config在firefox中,将其更改为false - 你会看到noscript节的内容。

但是,当我运行测试时,出现以下错误:

引发异常org.openqa.selenium.WebDriverException:正在等待evaluate.js加载失败

这是完整的回溯。

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

据我所知(在这里提出的几点的帮助下), 禁用JavaScript会杀死JavaScript webdriver本身 。 这是真的吗? 如果是的话,我的选择或解决方法是什么?


笔记:

  • 在铬的情况下,过去有可能通过--disable-javascript命令行参数禁用JavaScript,但现在不再了。

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

  • 设置javascript.enabled=false使用python selenium绑定的firefox偏好设置:

    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
    
  • 我愿意接受任何建议,并可以向您提供任何其他信息。


    这是实际发生的事情。

    事实证明,在研究了protractor和硒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.');
        });
    });
    

    希望这将有助于未来的人。


    据我所知(在这里提出的几点的帮助下),禁用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的源代码似乎可能。 有了这个功能,任何在网页上执行脚本的调用都会提前失败。


    根据你的堆栈跟踪,看起来你是用ff 33.1和selenium 2.43.1,所以它不支持。 请将您的硒版本升级到2.44以启用ff-33的测试。

    链接地址: http://www.djcxy.com/p/23565.html

    上一篇: Selenium WebDriver tests with JavaScript disabled

    下一篇: Mapping TimeSpan in SQLite and Dapper