简单的测试但无效的定位器:-(

Pat*_*ick 5 javascript selenium node.js typescript protractor

我有这个测试:

// import {by, element, browser} from "protractor";
describe('intro', () => {
  beforeEach(() => {
    browser.get('');
  });

it('should have multiple pages', () => {
    let buttonOnward = element(by.linkText('Continue'));
    expect(element.all(buttonOnward).count()).toBe(1);
  });
});
Run Code Online (Sandbox Code Playgroud)

得到这个结果.

1) intro should have multiple pages
  Message:
    Failed: Invalid locator
  Stack:
    TypeError: Invalid locator
        at Object.check [as checkedLocator] (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\by.js:267:9)
        at WebDriver.findElements (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:919:18)
        at C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\built\element.js:161:44
        at ManagedPromise.invokeCallback_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at asyncRun (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27)
        at C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:639:7
        at process._tickCallback (internal/process/next_tick.js:103:7)
    From: Task: Run it("should have multiple pages") in control flow
        at Object.<anonymous> (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:79:14)
        at C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:16:5
        at ManagedPromise.invokeCallback_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at asyncRun (C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27)
    From asynchronous test:
    Error
        at Suite.describe (C:\xampp\htdocs\test\intro_spec.ts:11:3)
        at Object.<anonymous> (C:\xampp\htdocs\test\intro_spec.ts:2:1)
        at Module._compile (module.js:556:32)
        at Object.Module._extensions..js (module.js:565:10)
        at Module.load (module.js:473:32)
        at tryModuleLoad (module.js:432:12)

1 spec, 1 failure
Run Code Online (Sandbox Code Playgroud)

我不知道为什么.它真的很简单.我下载了Jasmine的打字并检查了这个文件C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\by.js.

有一个为它定义的函数:

by.js中定义的函数

文档说这个功能也存在.

http://www.protractortest.org/#/api?view=ProtractorBy.prototype.buttonText

$ protractor --version
Version 4.0.9
$ npm -v
3.10.8
$ node -v
v6.7.0
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的想法!

ale*_*cxe 9

更多地扩展@ Gunderson的答案.主要问题是您使用ElementFinder(element()调用的结果)而不是by定位器.看看如何buttonOnward定义:

let buttonOnward = element(by.linkText('Continue'));
Run Code Online (Sandbox Code Playgroud)

现在,您正在使用buttonOnward,现在ElementFinder取代了定位器:

expect(element.all(buttonOnward).count()).toBe(1);
Run Code Online (Sandbox Code Playgroud)

这可以理解地导致"无效定位器"错误.


你的意思是使用"by"定位器代替:

expect(element.all(by.linkText('Continue')).count()).toBe(1);
Run Code Online (Sandbox Code Playgroud)


Gun*_*son 5

我不认为你的错误与linkText定位器有关,你的问题在于expect(element.all(buttonOnward).count()).toBe(1);,这是一个无效的定位器.如果你想计算总按钮,你应该只是声明你的定位器:

let buttonOnward = element.all(by.linkText('Continue'));
expect(buttonOnward.count()).toBe(1);
Run Code Online (Sandbox Code Playgroud)