我过去几年一直使用以下函数来过滤元素数组,并启用Webdriver的控制流:
filterElementsByText (elemList, comparator, locator) {
return elemList.filter((elem) => {
let searchTarget = locator ? elem.element(locator) : elem
return searchTarget.getText().then((text) => text === comparator)
})
}
我现在正在尝试将我的repo迁移到使用async/await,这需要关闭控制流。
这个转换大部分都成功了,但是我有一个函数出了问题。有时候,我会看到这个错误:
“失败:java.net.ConnectException:连接被拒绝:连接”
我已经写了一个针对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 的配置文件中设置的运行方式:
SELENIUM_PROMISE_MANAGER: false
使用简化测试用例似乎在5-10%的执行中出现问题(尽管,据说它在第一次出现后会更频繁地出现)
我的问题是,这感觉像是Webdriver中的一个错误,但我不确定什么条件会导致该错误,因此我不知道如何继续。
await
来编写filterElementsByText
,而不使用任何map
或filter
看看是否属于这种情况。 - Florent B.