gpt4 book ai didi

node.js - 将 ElementArrayFinder.filter() 与异步/等待一起使用

转载 作者:搜寻专家 更新时间:2023-10-31 23:19:48 24 4
gpt4 key购买 nike

在过去的几年里,我一直在使用以下函数来过滤元素数组,并启用了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com