Javascript 为什么可以';我不能在量角器中使用查询选择器吗?

Javascript 为什么可以';我不能在量角器中使用查询选择器吗?,javascript,protractor,Javascript,Protractor,我在用量角器。我知道量角器有类似Jquery的语法,但我需要一些可以 在我的一些测试中,基于DOM元素创建条件、变量和循环。我希望能够使用querySelector。仅仅使用承诺不会让我做我需要做的测试 当我运行它时,它会说: Failed: Cannot read property 'querySelector' of undefined 或 或 我已经设置了一个测试来测试这个问题。它从我正在查看的一个随机网页上运行。它使用量角器选择页脚,然后使用querySelector进行尝试。如果我在

我在用量角器。我知道量角器有类似Jquery的语法,但我需要一些可以 在我的一些测试中,基于DOM元素创建条件、变量和循环。我希望能够使用querySelector。仅仅使用承诺不会让我做我需要做的测试

当我运行它时,它会说:

Failed: Cannot read property 'querySelector' of undefined

我已经设置了一个测试来测试这个问题。它从我正在查看的一个随机网页上运行。它使用量角器选择页脚,然后使用querySelector进行尝试。如果我在控制台中输入querySelector部分,它将正确运行代码。我还尝试了querySelector的变体,使用window.document;这也适用于浏览器,但不适用于量角器

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);
  });

});

您在量角器测试用例中运行的代码实际上并没有在浏览器中运行,事实上它是在
Node.js
中执行的。您应该将其视为一个API,之后将通过
WebDriver
与浏览器进行通信。这意味着您不能在代码中使用特定于浏览器的
JavaScript
API。
$
帮助程序就是为了使语法简单易懂,而不需要了解任何关于Selenium的知识。这就是为什么您无法访问
文档
窗口
。如果您想了解更多这方面的信息:

@Nhor的答案基本上是正确的,因为它涉及到环境以及您不能直接使用
文档和
窗口的原因。但是,无论如何,您可以通过找到DOM中的元素。唯一的问题是,你为什么要这么做

可以在DOM中使用的任何定位器都可以在量角器中使用(尽管语法可能不同)。下面是一个示例,我使用了
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函数。它不是量角器的
ElementFinder
版本,您不能对它执行
getText()
之类的操作(尽管它仍然是一个承诺,所以您需要调用
.then()
)。您可以在
el
上进行控制台登录,查看该对象中的内容。

如果我需要在没有承诺的情况下定位DOM元素,该怎么办?这是不可能的,这就是
WebDriver
的工作方式,您对此无能为力,如果它仍然是承诺,与常规ElementFinder相比,这有什么好处?@munchscheal实际上没有好处,这就是为什么我在回答“为什么您需要这样做?”。使用
querySelector
可以获取的任何定位器,都可以从它们的方法中获取量角器。只是想让您知道它可能有用,例如,在
it()
字符串上写入名称、状态和ID。。。
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);
  });

});
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"
    });
  });
});