2016-10-01 60 views
5

我有這樣的測試:簡單測試,但無效定位:-(

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

而得到這樣的結果

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 

而且我不知道爲什麼它很簡單,我下載了。茉莉和分型檢查該文件C:\Users\Patrick\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\by.js

沒有爲它定義一個函數:

The defined function in 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 

預先感謝您的想法!

回答

8

擴大@ Gunderson的答案一點點。主要問題是您正在使用ElementFinder(呼叫的結果爲element())而不是by定位器。如何看buttonOnward定義:

let buttonOnward = element(by.linkText('Continue')); 

現在,您使用的是buttonOnward,它現在是一個ElementFinder代替定位器:

expect(element.all(buttonOnward).count()).toBe(1); 

這可以理解,結果爲「無效定位器「錯誤。


你的意思是使用 「用」 而不是定位:

expect(element.all(by.linkText('Continue')).count()).toBe(1); 
5

我不認爲你的錯誤與linkText定位器有關,你的問題是expect(element.all(buttonOnward).count()).toBe(1);,這是一個無效的定位器。如果你想計算總按鈕,你應該只聲明你的定位器是這樣的:

let buttonOnward = element.all(by.linkText('Continue')); 
expect(buttonOnward.count()).toBe(1); 
1

在我來說,我是用browser.driver.findElement。這意味着我正在使用Selenium API。但是,Selenium API顯然不支持by.model定位器。然而,量角器 API不包括對by.model locator支持,並使用量角器 API我用element函數:

不起作用:

//This would not work: 
//error E/launcher - Error: TypeError: Invalid locator 
browser.driver.findElement(by.model('login_form.email')) 

作品:

//But this works; note it uses the `element` function 
//instead of `browser.driver.findElement` 
element(by.model('login_form.email')) 

Also works:

//And this also works; note it uses `browser.driver.findElement` 
//But it passes a different locator; not `by.model`, but `by.id` 
browser.driver.findElement(by.id('#login_form_email')) 

注:

量角器by.model定位器將最終call a CSS querySelectorAll'ng-model'前綴。量角器增加by.model定位器功能是有道理的,因爲量角器更加註重角度。

我假設硒不支持原生by.model因爲 「模式」 定位爲not listed among Selenium (Java) locators on this page

  • 編號
  • 名稱
  • 類名
  • CSS
  • Xpath的
  • 如何op

Nor in this Python硒方法列表。