- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在过去的几年里,我一直在使用以下函数来过滤元素数组,并启用了 Webdriver 的控制流:
filterElementsByText (elemList, comparator, locator) {
return elemList.filter((elem) => {
let searchTarget = locator ? elem.element(locator) : elem
return searchTarget.getText().then((text) => text === comparator)
})
}
我现在正尝试将我的存储库迁移到使用 async/await,这需要关闭控制流。
此转换大体上是成功的,但我在使用上述功能时遇到了问题。间歇性地,我看到这个错误:
Failed: java.net.ConnectException: Connection refused: connect
我能够使用针对 https://angularjs.org 编写的测试用例重现此问题,尽管它在我自己的应用程序中发生的频率要高得多。
let todoList = element.all(by.repeater('todo in todoList.todos'))
let todoText = element(by.model('todoList.todoText'))
let todoSubmit = element(by.css('[value="add"]'))
let addItem = async (itemLabel = 'write first protractor test') => {
await todoText.sendKeys(itemLabel)
return todoSubmit.click()
}
let filterElementsByText = (elemList, comparator, locator) => {
return elemList.filter((elem) => {
let searchTarget = locator ? elem.element(locator) : elem
return searchTarget.getText().then((text) => {
console.log(`Element text is: ${text}`)
return text === comparator
})
})
}
describe('filter should', () => {
beforeAll(async () => {
browser.ignoreSynchronization = true
await browser.get('https://angularjs.org')
for (let i = 0; i < 10; i++) {
await addItem(`item${i}`)
}
return addItem()
})
it('work', async () => {
let filteredElements = await filterElementsByText(todoList, 'write first protractor test')
return expect(filteredElements.length).toEqual(1)
})
})
这是在 Protractor 的 conf 文件中使用以下设置运行的:
SELENIUM_PROMISE_MANAGER: false
对于简化的测试用例,它似乎发生在 5-10% 的执行中(尽管据传闻,它似乎在第一次发生时发生得更频繁)
我的问题是,这感觉像是 Webdriver 中的错误,但我不确定什么情况会导致该错误,所以我不确定如何继续。
最佳答案
对于任何阅读和思考的人来说,我自己的应用程序的问题有两个方面。
首先,如对原始问题的评论中所述,ElementArrayFinder.filter() 会导致此错误,因为它对数组中的每个元素运行并行请求。
其次(在原始问题中并不明显),而不是像这个测试用例中描述的那样传递 ElementArrayFinder,我实际上传递了数组中每个元素的链式子元素,例如:
element.all(by.repeater('todo in todoList.todos').$$('span')
在发生这种情况时查看 Webdriver 输出,我注意到这会导致并行检索所有这些定位器,从而导致相同的错误。
我能够通过这种方式过滤来解决这两个问题:
let filterElementsByText = async (elemList, comparator, locator) => {
let filteredElements = []
let elems = await elemList
for (let i = 0; i < elems.length; i++) {
let elem = await elems[i]
let searchTarget = locator ? elem.element(locator) : elem
let text = await searchTarget.getText()
if (text === comparator) {
filteredElements.push(elem)
}
}
return filteredElements
}
这解除了我的阻塞,但仍然感觉这些函数无法与 async/await 一起使用是个问题。
关于node.js - 将 ElementArrayFinder.filter() 与异步/等待一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47636248/
我正在学习 Protractor ,到目前为止这是一段疯狂的旅程,因为我对 Javascript 也很陌生。到目前为止,我了解到 Protractor 对所有 promise 进行排队,并且可以使用
我是使用 Protractor 编写端到端 Javascript 测试的初学者。我一直在尝试识别具有与之关联的文本属性的元素数组。我可以使用 来定位他们 groupedNodeNumbers : El
我们有一个表示为 ul->li 的菜单列表(简化): Menu Item 1 ... Menu Item 2 在
是否可以将 element.all(....) 的结果返回的 ElementArrayFinder 转换为通用数组? 目标是将元素存储在数组中,并使用 push() 从另一个 element.all(
看书学AngularJS,有一个简单 Protractor 测试的例子: it('Should redirect to #/posts/1/sample-title1', function (
是否有官方方法来确定我从函数接收的输入是 ElementFinder(单个 Web 元素)还是 ElementArrayFinder(一组网络元素)。 到目前为止我已经知道了。 if (_.isFun
如果调用 Protractor elementArrayFinder 的 map 函数,它会立即在 DOM 中搜索要映射的元素,这与 $$ 的行为不同等到需要子 elementArrayFinder
这是 Take elements while a condition evaluates to true (extending ElementArrayFinder) 的后续问题特别是主题和@cvak
我正在用 Protractor 编写一个函数来获取列表的所有行元素。该函数检查多种类型的列表。它使用方法 isPresent() 来检查是否存在一种类型的列表。如果不是,它将移至下一个类型。由于 is
我在 Protractor 中遇到一种情况,我想将 ElementArrayFinder getTexts 存储在数组中并从方法返回数组。到目前为止我已经写了这样的方法: static getAllT
我在我的页面对象中声明了这个: this.paginationPageNumberList = element.all(by.repeater("page in pages track by $ind
我正在使用 TypeScript 来自动化 E2E 测试。如果我做一些事情,比如self.all(by.xpath(".//thead/tr/th|.//thead/tr/td")).then...
我正在使用 Protractor 在 Angular 8 应用程序中进行 e2e 测试,目前我无法根据需要使“每个”循环正常工作。在我的页面对象中,我创建了一个返回 ElementArrayFinde
在过去的几年里,我一直在使用以下函数来过滤元素数组,并启用了 Webdriver 的控制流: filterElementsByText (elemList, comparator, locator)
我是 Protractor 的新手,我将它与 chai 和 chai-as-promised 结合使用。目前,当我的 ElementArrayFinder 不包含我需要的元素时,我正试图弄清楚如何最好
我是一名优秀的程序员,十分优秀!