ale*_*cxe 7 javascript testing firefox selenium-webdriver protractor
如果在浏览器中禁用了javascript(使用),我们的一个内部应用程序(用angularjs编写)会出现一个特殊的错误框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
}
};
Run Code Online (Sandbox Code Playgroud)
在哪里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;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,我们设置javascript.enabled
firefox首选项,false
如果您about:config
在firefox中手动打开,将其更改为false
- 您将看到该noscript
部分的内容.
但是,当我运行测试时,我收到以下错误:
引发异常org.openqa.selenium.WebDriverException:等待evaluate.js加载失败
这是完整的追溯.
使用FYI,selenium 2.44.0
和firefox 33.1.1
.
据我了解(借助此处提出的几点),禁用javascript会杀死javascript webdriver本身.这是真的吗?如果是,我的选择或解决方法是什么?
笔记:
在chrome的情况下,过去可以通过--disable-javascript
命令行参数禁用javascript ,但不能 再禁用javascript .
这导致一个变通方法号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
Run Code Online (Sandbox Code Playgroud)我对任何建议持开放态度,可以为您提供任何其他信息.
这是实际发生的事情。
事实证明,在探索了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;
Run Code Online (Sandbox Code Playgroud)
而且我没有将其设置为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.');
});
});
Run Code Online (Sandbox Code Playgroud)
希望这对将来的人有所帮助。