我们最近从Protractor 4.0.14升级到5.3.0并遇到错误。我们的测试做的是:
element.all(by.css('some locator')).all(by.cssContainingText('some locator', 'some description'));
它使用量角器4.0.14很好,但是使用5.3.0,我收到了这个错误:
- 失败:未知错误:searchText.indexOf不是函数 (会话信息:chrome = 65.0.3325.146)
最新版本的量角器是否会导致这种情况发生变化?
答案 0 :(得分:1)
就我而言,问题只是我没有将字符串参数传递给 cssContainingText
,而是一个数字值。修复只是将其转换为字符串(添加 +''
),例如
by.cssContainingText('css selector', 123 + ''))
在以前的版本中,由于 Javascript 的动态类型,这运行良好,但是当添加了正则表达式支持(如另一个 answer 中所述)时,the code 现在开始调用 indexOf
函数仅适用于字符串的参数。
答案 1 :(得分:0)
https://github.com/angular/protractor/commits/master/lib/locators.ts
看起来cssContainingText
定位器有一些变化以允许正则表达式。但我在该文件中看不到indexOf
。
这是承诺 https://github.com/angular/protractor/pull/4532
我发现它也涉及clientSideScripts.ts
https://github.com/angular/protractor/blob/master/lib/clientsidescripts.js
在functions.findByCssContainingText
中,它引用了searchText.indexOf('__REGEXP__')
,如果searchText
未定义,它可能会遇到类似于您的错误条件。
在没有第二个参数的情况下使用by.cssContainingText('someSelector')
?或者你的第二个参数可能以null / undefined(而不是空字符串)的形式出现?
答案 2 :(得分:0)
我发现,如果我从包含选择器的对象之外的另一个对象内部引用一个描述符(在我的情况下为regex),我也会遇到此错误。基本上给它传递索引而不是直接引用会破坏它。像这样...
element.all(by.css('some locator')).all(by.cssContainingText('some locator', CONSTANTS.regexPatterns.someDescriptionRegex)
虽然在'this'中更直接的引用还是可以的...
someDescriptionRegex: {get function() { return new RegExp(...) }},
element.all(by.css('some locator')).all(by.cssContainingText('some locator', this.someDescriptionRegex)
希望这会有所帮助。