【问题标题】:Protractor - click within For Each not behaving as expected量角器 - 在 For Each 中单击未按预期运行
【发布时间】:2020-01-01 21:07:45
【问题描述】:

在以下量角器代码中

const tabs = await element.all(by.id('tab'));
tabs.forEach(async tab => {
  tab.click().then(function() {
  element.all(by.id('radio1')).click();
});
}); 
 await element(by.id('saveAndContinue')).click();

radio1 仅在最后一个选项卡中单击,因为 saveAndContinue 的最后一行被隐藏,因此它的 click() 失败

虽然 Sleep 确实在 FOR 循环之外工作,但当我想在 radio1 点击之前留出时间时却不行

编辑 1:问题是每一行都在为最后一个选项卡执行 radio1 点击,而不是之前点击的选项卡。选项卡点击速度很快,radio1 被点击。

【问题讨论】:

  • 我想你会发现 .forEach() 不能很好地配合 async/await。您可能想切换到仅使用常规的旧 for 循环。反正这是我的经验。可能是您的问题的一部分。
  • 我试过了: const tabs = await element.all(by.name("tab")); for(let i=0; i

标签: javascript asynchronous foreach protractor click


【解决方案1】:

感谢以上Sergey Pleshakov 的以下作品(稍作改动后):

async doGateway2bComplexHappyPath() {
let tabs = element.all(by.id('tab'));

let tabCount = await tabs.count();
for (let i = 0; i < tabCount; i++) {
  tabs.get(i).click();
  //browser.sleep(1000);
  element.all(by.id('radio1')).click();
  //browser.sleep(1000);
}

 //await browser.sleep(1000);
 await element(by.id('saveAndProceed')).click();
}

【讨论】:

  • 小心这个。 Click() 是一个承诺。 await 关键字需要解决该承诺,如果您不使用它,它可能会被执行,但不能保证正确的操作顺序。如果您开始使用“等待”,请继续这样做直到结束。另一个问题是element.all...click()。这样想 - 你说有多个元素,你正在执行 1 点击......哪个元素得到它?我个人不知道答案,但尽量具体一点 - 例如 element.all().first().click()last()get(number)
  • await 因单击错误'失败:元素不可交互'删除等待传递而失败,但是警告是 ===>> UnhandledPromiseRejectionWarning:ElementNotVisibleError:元素不可交互
    (节点:33548)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝 ID:1)(节点:33548)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。
  • stackoverflow.com/a/48899752/3627914 的帮助下也解决了我的控制台错误
【解决方案2】:

1) 错过await 领先tab.click()

2) element.all().click() 不应该工作

const tabs = await element.all(by.id('tab'));
tabs.forEach(async tab => {
  await tab.click();
  await element.all(by.id('radio1')).first().click();
  // I think you should not find all radio1 of entire page, 
  // it will find radio1 of other tabs which is not visible in the active tab.
  // and protractor will fail to click on invisible radio1
  // thus you should find raido1 which is belongs to active tab

}); 
await element(by.id('saveAndContinue')).click();

【讨论】:

  • 1) 我确实尝试过在 tab.click() 之前使用 AWAIT 的代码变体,但没有成功 2) element.all().click() 正在为最后一个标签工作,当我之前睡觉时最后一个按钮并移动到其他上一个选项卡,然后单击该移动选项卡的所有radio1? 3) 再次不起作用的变体: const tabs = await element.all(by.id('tab')); tabs.forEach(async tab => { await tab.click().then(async function() { //browser.sleep(2000); const radios = await element.all(by.id('radio1')); radios.forEach(async rd => { rd.click();}); });});
  • yong,我解决了如下:comment here
【解决方案3】:

由于您没有附加 HTML 和应用程序的屏幕截图,因此这是我在黑暗中拍摄的照片...试试这个,让我知道是否可行

let tabs = element.all(by.id('tab'));
let radioButtons = element.all(by.id('radio1'));

let tabCount = await tabs.count();
for (let i = 0; i < tabCount; i++) {
  await tabs.get(i).click();
  let radioCount = await radioButtons.count();
  for (let j = 0; j < radioCount; j++) {
    await radioButtons.get(j).click();
  }
}
await element(by.id('saveAndContinue')).click();

【讨论】:

  • 非常感谢,在对您的代码进行自定义更改后,它终于奏效了!我已经分别添加了评论
【解决方案4】:

有几点需要注意,“id”属性必须是唯一的。您不应该有多个具有相同 id 的元素,这可能会导致一些古怪的行为。 查看此答案作为来源Does ID have to be unique in the whole page?

另外,element.all() 将返回一个元素数组,因此您正在尝试单击一个元素数组。

请参阅量角器文档中 element.all() 的文档 https://www.protractortest.org/#/api?view=ElementArrayFinder

假设元素作为数组返回,尽管使用了重复的 html id,您仍需要像这样单独单击它们

element.all(by.id('radio1')).then(function (myIds) {
myIds[0].click();
myIds[1].click();
});

或者当然是循环遍历它们。

祝你好运

【讨论】:

  • thanx for response 1) 是 ID 是唯一的 2) 问题不在于它是否获取元素数组或只有一个,tab.Click() 只是移动到下一个而不单击先前选项卡中的任何 radio1
  • 如果 ID=radio1 是唯一的,那么您的整个代码没有意义。这意味着在整个页面上只有一个 id=radio1 元素,所以只需使用 element(by.id('radio1')).click()
  • 我很抱歉之前的错误评论答案。在不同的电台列表类别中有超过 1 个 id=radio1 的电台。 multip rows with radios, id=radio1, radio2, etc 我在上面附加了原始问题 Edit 1
猜你喜欢
  • 1970-01-01
  • 2013-08-10
  • 2020-08-02
相关资源
最近更新 更多