2016-10-01 2 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

Чтобы продлить @ ответ Гандерсон в немного больше. Основная проблема заключается в том, что вы используете 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. Это означает, что я использовал API 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')) 

Также работ:

//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'. Имеет смысл, что Protractor добавляет функциональность локатора by.model, потому что Транспортир более ориентирован на углы.

Я предполагаю, Селен не поддерживает by.model изначально, так как "модель" локатор not listed among Selenium (Java) locators on this page

  • Id
  • Имя
  • ИмяКласса
  • CSS
  • Xpath
  • Как op

Nor in this Python список методов Селена.

Смежные вопросы