【问题标题】:Is it possible to use a for loop for DRY protractor test? *var coming up undefined*是否可以使用 for 循环进行 DRY 量角器测试? *var 出现未定义 *
【发布时间】:2015-01-30 04:22:39
【问题描述】:

目标:我想在 it 块上创建一个循环,以测试元素文本是否匹配。

错误: Error: No element found using locator: by.cssContainingText(".submenu li a", "undefined")

问题:如何编写一个 for 循环来测试多个列表项?此外,我如何使var title 对内部it block 可见

对于这个例子:我有 2 个测试,我想通过循环进行干燥 下一个测试示例只是伪代码无法在下面进行工作测试

var config = require('../../protractor.conf.js').config;

describe('this Homepage Body Tests', function(){

  browser.driver.get(config.homepageUrl);

  describe('sub navigation functionality', function () {
    //creates teh array of strings for this sample
    var title = ['find a store', 'clinic'];


    for(var i = 0; i < title.length; i++){

      it("should open find a" + title[i] + "page", function(){

        browser.driver.sleep(2000);
        browser.ignoreSynchronization = true;
        var link = element(by.cssContainingText('.submenu li a', title[i]));
        expect(link.getText()).toEqual(title[i]);


      });
    };
 });

});

HTML:

  <div class="submenu">
    <ul>
        <li><a >find a store</a>
        </li>
        <li><a>clinic</a>
        </li>

    </ul>
  </div>

工作测试示例:

it("should open find a store page", function(){

  browser.driver.sleep(2000);
  browser.ignoreSynchronization = true;

  var title = 'find a store';
  var link = element(by.cssContainingText('.submenu li a', title));


  expect(link.getText()).toEqual(title);


});

it("should open find a clinic page", function(){

  browser.driver.sleep(2000);
  browser.ignoreSynchronization = true;

  var title = 'clinic';

  var link = element(by.cssContainingText('.submenu li a', title));


  expect(link.getText()).toEqual(title);


});

更新:

it("should open find a store page", function(){

      browser.driver.sleep(2000);
      browser.ignoreSynchronization = true;

      var string = 'find a store';
      var main = '.main';
      var link = element(by.cssContainingText('.submenu li a', string));


      expect(link.getText()).toEqual(string);
      //I WANT OT CLICK ON THAT TOO!
      link.click().then(function() {

        browser.driver.sleep(3000);
        var title = element(by.cssContainingText(main, string));
        expect(title.getText()).toBe(string);
      });

    });

【问题讨论】:

    标签: javascript angularjs selenium-webdriver protractor angularjs-e2e


    【解决方案1】:

    这就是element.all() + map() 可以提供帮助的地方:

    var titles = element.all(by.css('.submenu li a')).map(function (elm) {
        return elm.getText();
    });
    
    expect(titles).toBeArrayOfStrings();
    expect(titles).toEqual(['find a store', 'clinic']);
    

    仅供参考,这是相关的功能请求:

    另见:

    【讨论】:

    • 无论如何都标记为正确。如果需要,我可以提出一个新问题
    • @MatthewHarwood 我会 AFK 一段时间,请单独询问,谢谢。无论如何,我稍后会检查新问题。
    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多