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