我正在使用量角器。我知道量角器有Jquery的语法,但我需要的东西可以 在我的一些测试中,基于DOM元素创建条件,变量和循环。我希望能够使用querySelector。只使用承诺不会让我做我需要做的那种测试。
当我运行时,它说:
Failed: Cannot read property 'querySelector' of undefined
或
Failed: document is not defined
或
Failed: window is not defined
我已经设置了一个测试来测试这个问题。它运行在我正在查看它的随机网页上。它使用量角器选择页脚,然后使用querySelector尝试它。如果我在控制台中输入querySelector部分,它会正确运行代码。我也使用window.document尝试了querySelector的变种;这也适用于浏览器,但不适用于量角器。
describe("Test", function()
{
it('This is a test to test protractor' , function()
{
browser.waitForAngularEnabled(false);
browser.get("https://facebook.github.io/jest/");
$("#footer").getAttribute("innerHTML").then( function(value)
{
console.log("inside value then");
console.log(value);
});
var queryse = document.querySelector("#footer").innerHTML;
// var queryse = browser.document.querySelector("#footer").innerHTML;
// var queryse = window.document.querySelector("#footer").innerHTML;
console.log('query selector');
console.log(queryse);
});
});
答案 0 :(得分:4)
您在Protractor测试用例中运行的代码并不真正在浏览器中运行,实际上它是在Node.js
中执行的。您应该将其视为一个API,然后通过WebDriver
与浏览器进行通信。这意味着您无法在代码中使用特定于浏览器的JavaScript
API。 $
帮助器就是为了使语法简单易懂而不了解Selenium。这就是为什么document
和window
无法访问的原因。如果您想了解更多相关信息:https://github.com/angular/protractor/blob/master/docs/locators.md
答案 1 :(得分:3)
@ Nhor的答案在环境方面大致正确,以及为什么不能直接使用document
和window
。但是,对于它的价值,你绝对可以通过executeScript找到DOM中的元素。唯一的问题是,为什么你需要这样做?
您可以在DOM中使用的任何定位器,您可以在Protractor中使用(尽管语法可能不同)。这是一个例子,我使用innerHTML
,因为那是你在案件中尝试的内容:
describe('Protractor Demo App', function() {
it('element test', function() {
browser.get('http://juliemr.github.io/protractor-demo/');
var el = browser.executeScript('return document.querySelector("h3").innerHTML');
el.then(function (text) {
console.log(text); // logs "Super Calculator"
});
});
});
最后,请注意,此el
仅限于executeScript
调用中的javascript函数,这一点非常重要。它不是Protractor ElementFinder
的一个版本,你不能对其执行getText()
之类的操作(虽然它仍然是Promise,所以你需要调用.then()
)。您可以在el
上执行控制台日志,以查看该对象中的内容。