如何从量角器中的json文件中读取定位器?

时间:2016-09-13 13:13:44

标签: protractor

我想开发一个框架,我将所有定位器保存在一个地方,在一个json文件中说test.json。像这样。

{
    "yourName": "by.model('yourName')"
}

我希望在下面的规格中阅读此内容。

    var test = require('./test.json');

describe('angularjs homepage todo list', function() {
  it('should add a todo', function() {
    browser.get('https://angularjs.org');

    var webElement = element(testtest.yourName);

    webElement.sendKeys('write first protractor test');
  });
});

但当我这样做时会收到错误失败:无效的定位器,并显示以下错误跟踪。

Failures:
1) angularjs homepage todo list should add a todo
  Message:
    Failed: Invalid locator
  Stack:
    TypeError: Invalid locator
        at Object.check [as checkedLocator] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\by.js:267:9)
        at WebDriver.findElements (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:919:18)
        at C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:159:44
        at ManagedPromise.invokeCallback_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at asyncRun (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27)
        at C:\Users\karunakaralchala\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)Error
        at ElementArrayFinder.applyAction_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:396:27)
        at ElementArrayFinder._this.(anonymous function) [as sendKeys] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:99:30)
        at ElementFinder.(anonymous function) [as sendKeys] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:730:22)
        at Object.<anonymous> (E:\ui\TestTest\todo-spec.js:9:20)
        at C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:94:23
        at new ManagedPromise (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1082:7)
        at controlFlowExecute (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:80:18)
        at TaskQueue.execute_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at asyncRun (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2820:25)
    From: Task: Run it("should add a todo") in control flow
        at Object.<anonymous> (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:79:14)
    From asynchronous test:
    Error
        at Suite.<anonymous> (E:\ui\TestTest\todo-spec.js:4:7)
        at Object.<anonymous> (E:\ui\TestTest\todo-spec.js:3:5)
        at Module._compile (module.js:541:32)
        at Object.Module._extensions..js (module.js:550:10)
        at Module.load (module.js:458:32)
        at tryModuleLoad (module.js:417:12)

有没有更好的方法呢?或者我需要做些什么呢?

3 个答案:

答案 0 :(得分:1)

可能不是这个问题的直接答案,但我认为你并没有以传统的方式尝试这个问题,而是部分重新发明轮子。

不是将定位器保存在单独的JSON结构中,而是将它们组织到Page Objects - 单独的页面对象(包括元素定位器和与页面交互的方法),用于单独的页面或页面的一部分。

答案 1 :(得分:1)

这应该有用。

<强> test.json

{
  "siteURL": "https://angularjs.org",
  "locators": {
    "todoText": {
      "model": "todoList.todoText"
    }
  }
}

<强> spec.js

    var test = require('./test.json');

   describe('angularjs homepage todo list', function() {
      it('should add a todo', function() {
        browser.get(test.siteURL);

        var webElement = element(by.model(test.locators.todoText.model));

        webElement.sendKeys('write first protractor test');
  });
});

这里使用BDD Cucumber,json和pageobject模型的一个完整示例。 https://github.com/aluzardo/protractor-cucumber-tests/

答案 2 :(得分:0)

你的方法中有一个简单的错误。

JSON中的值被读取为字符串,您将字符串传递给element()而不是定位符(不是by对象)

var webElement = element(test.yourName); // Incorrect. test.yourName returns  string

改变方式瞧!你应该好。使用eval()。请参阅here

    var webElement = element(eval(test.yourName));