【问题标题】:Protractor - X is not a function量角器 - X 不是函数
【发布时间】:2019-02-20 12:33:28
【问题描述】:

在量角器中,我试图从我的规范文件中的另一个页面运行一个函数。

我的规格文件:

let TablePage = require("./../pages/TablePage");
let table_page = new TablePage();
let protractor = require("protractor");
let browser = protractor.browser;

   describe('Login', function() {
        beforeEach(function() {
            browser.ignoreSynchronization = true;
            browser.waitForAngular();
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
            browser.get("/budget");
        });

        it('should get values from list', function(){
            table_page.getPriceValuesFromList();
        });

我得到该功能的另一种文件形式(TablePage.js):

let protractor = require("protractor");
let browser = protractor.browser;
let number = 0;
let prices = [];

let TablePage = (function () {
  function TablePage() {

  }

  TablePage.prototype.getPriceValuesFromList = function () {
    for (number = 1; number < 100; number++) {
      let locator = '//*[@id="root"]/main/section/table/tbody/tr[' + number + ']/td[3]/div[2]';
      browser.findElement(By.xpath(locator)).then(function (err) {
        prices[number] = element(By.xpath(locator)).getText();
        console.log(prices[number])
      }, function (err) {
        if (err) {
          break;
        }
      })
    }
  };

  return TablePage;

});
module.exports = TablePage;

我收到一个错误:table_page.getPriceValuesFromList 不是函数

你知道怎么了吗?我在另一个项目中就是这样做的,它正在工作。 这个函数真正的typeof()是未定义的

您还可以检查该函数是否有效 - 它应该从表的一行获取值,将其保存在数组中并转到下一行,直到找不到行内的值 - 从列中保存值

【问题讨论】:

标签: javascript function selenium protractor automated-tests


【解决方案1】:

有几行不应该在那里。 TablePage 应该定义如下:

function TablePage() { }

// Removed lines which were here.

TablePage.prototype.getPriceValuesFromList = function () {
    for (number = 1; number < 100; number++) {
        let locator = '//*[@id="root"]/main/section/table/tbody/tr[' + number + ']/td[3]/div[2]';
        browser.findElement(By.xpath(locator)).then(function (err) {
            prices[number] = element(By.xpath(locator)).getText();
            console.log(prices[number])
        }, function (err) {
            if (err) {
                break;
            }
        })
    }
};

// And removed the return TablePage();

作为一个面向对象的人,我更喜欢使用类来实现:

class TablePage {

    getPriceValuesFromList() {
        for (number = 1; number < 100; number++) {
            let locator = '//*[@id="root"]/main/section/table/tbody/tr[' + number + ']/td[3]/div[2]';
            browser.findElement(By.xpath(locator)).then(function (err) {
                prices[number] = element(By.xpath(locator)).getText();
                console.log(prices[number])
            }, function (err) {
                if (err) {
                    break;
                }
            })
        }
    };

};

【讨论】:

  • 第一个解决方案:同样的错误,第二个解决方案我应该删除“let table_page = new TablePage();”从规范文件?我应该如何调用该函数?我得到 TablePage 不是构造函数
  • 独立于您需要实例化TablePage 的解决方案,就像您在规范文件中所做的那样。两种解决方案都可以在我的计算机上运行,​​尽管我实际上并没有运行量角器,只是检查了类和函数是否可以解析,这在两种实现中都成功了。据我所知,您的函数调用没有任何问题。请注意,您仍应像在最后一行中那样导出 TablePage。
  • 啊,我觉得是什么问题,你是不是把出口上面的return TablePage;去掉了?
  • 不,这不是返回的问题,我删除了它,但仍然看不到 TablePage 的内容,当我尝试从规范文件运行时,所有元素都未定义,甚至定位器this.text = table_page.workingBalanceField.getText();我无法读取未定义的属性“getText”,似乎 TablePage 开头的导入或函数有问题
  • 我很确定删除 return TablePage 可以解决最初的问题。我在这里成功运行了代码,没有所有与量角器相关的东西,因为那与它无关。您在 cmets 中引用的代码似乎是新的,它不存在于原始代码中。我建议为新错误创建一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多