【问题标题】:Click an element if another element contains a specific text. Automated Test with Protractor如果另一个元素包含特定文本,请单击一个元素。使用量角器进行自动化测试
【发布时间】:2020-11-13 13:07:36
【问题描述】:

我需要检查 3 个元素中的哪一个包含文本“10%”,但我不确定我是否正确获取了元素的文本。当我运行代码时,我没有收到错误,但 if 条件始终为假(也应为真)。

我在规范中的 javascript 代码:

await driver.wait(until.elementIsVisible(await driver.findElement(By.css("tr:nth-child(1) .font-weight-bold-light > span"))), 30000)
await driver.wait(until.elementIsVisible(await driver.findElement(By.css("tr:nth-child(2) .font-weight-bold-light > span"))), 30000)
await driver.wait(until.elementIsVisible(await driver.findElement(By.css("tr:nth-child(3) .font-weight-bold-light > span"))), 30000)

var array = ["tr:nth-child(1) .font-weight-bold-light > span", "tr:nth-child(2) .font-weight-bold-light > span", "tr:nth-child(2) .font-weight-bold-light > span"];
var arrayDelete = ["tr:nth-child(1) img:nth-child(2)", "tr:nth-child(2) img:nth-child(2)", "tr:nth-child(3) img:nth-child(2)"]
for (var k = 0; k<array.length; k++){

  var allOpts = (await driver.findElement(By.css(array[k])));
  await driver.sleep(2000)

  if (allOpts == ('10%')) {
    await driver.sleep(2000)
    await driver.wait(until.elementIsVisible(await driver.findElement(By.css(arrayDelete[k]))), 30000)
    // 11 | click | css=.actions > img:nth-child(2) | 
    await driver.findElement(By.css((arrayDelete[k]))).click()
    // 12 | pause | 1000 | 
    await driver.sleep(5000)
    // 13 | waitForElementVisible | css=.ml-3 | 30000
    await driver.wait(until.elementIsVisible(await driver.findElement(By.css(".ml-3"))), 30000)
    // 14 | click | css=.ml-3 | 
    await driver.findElement(By.css(".ml-3")).click()
    // 15 | pause | 3000 | 
    await driver.sleep(10000)
    // 16 | verifyElementNotPresent | css=td:nth-child(1) | 
    {
      const elements = await driver.findElements(By.css((allOpts)))
      assert(!elements.length)
    }
    console.log(('ho cancellato l obiettivo ')+ k);
  
  } else {
    console.log(('obiettivo ') + k + (' non cancellato, in quanto il suo peso non è 10%'));
  }
}

我尝试了所有这些:

if (allOpts == (' 10% ')) 
if (allOpts == ('10%')) 
if (allOpts === (' 10% ')) 
if (allOpts === ('10%')) 
if (allOpts.getText() == (' 10% ')) 
if (allOpts.getText()  == ('10%')) 
if (allOpts.getText()  === (' 10% ')) 
if (allOpts.getText()  === ('10%')) 
if (allOpts.getAttribute("value") == (' 10% ')) 
if (allOpts.getAttribute("value")  == ('10%')) 
if (allOpts.getAttribute("value")  === (' 10% ')) 
if (allOpts.getAttribute("value")  === ('10%'))

这些都不允许运行 if 条件的主体。

这是我的html:

<td _ngcontent-lqu-c20="">
  <p _ngcontent-lqu-c20="" class="font-weight-bold-light">
    <!---->
    <span _ngcontent-lqu-c20=""> 10% </span>
  </p>
</td>

【问题讨论】:

  • 如果你控制台记录元素的文本会发生什么?
  • 谢谢,我之前必须考虑过这个......无论如何,通过 console.log 我看到我没有收到文本,而是其他内容。

标签: javascript if-statement protractor automated-tests conditional-statements


【解决方案1】:

您错过了致电getText()阅读网页元素上的内容

var allOpts = (await driver.findElement(By.css(array[k])).getText()).trim()

【讨论】:

    【解决方案2】:

    首先,您的语法不是量角器的典型语法(除非您使用的是一些非常旧的版本)。如果这是您使用的工具,请查看他们的documentation

    其次,在这一行中,您只是声明了元素,并没有对它做任何事情

    var allOpts = (await driver.findElement(By.css(array[k])));
    

    你应该已经提取了元素的文本。但是使用正常的语法它看起来像这样

    var allOpts = await element(by.css(array[k])).getText();
    

    三、这个不起作用的原因

    if (allOpts.getText() == (' 10% '))
    

    是因为这是一个承诺,你需要通过.then()awaiting 来解决它。除非你深入了解这个过程(我的意思是......在所有细节中),否则你不会用量角器走得太远

    四,当您执行.getText() 时,您的字符串会被修剪,这意味着开头和结尾没有空格('10%' 不是' 10% '

    五,如有疑问,只需console.log() 值。这是调试问题的最简单方法

    最后,不要使用==,而是使用===。使用量角器工作了 3 年,我从来没有遇到过必须使用 == 的情况,但在使用它时我确实有很多由 coercion 造成的困惑

    【讨论】:

    • 我试过 var allOpts = await element(by.css(array[k])).getText();但我收到此错误:失败:等待量角器与页面同步时出错:“angularJS 可测试性和角度可测试性都未定义。这可能是因为这是一个非角度页面,也可能是因为您的测试涉及客户端导航,这可能会干扰 Protractor 的引导。有关详细信息,请参阅 git.io/v4gXM"
    • 好的,我明白你为什么使用这种语法了。您的应用程序没有角度。 browser.waitForAngularEnabled(false) 可以解决问题...
    • False,我的应用程序是 Angular,如果我添加你的命令(我已经尝试过)我得到错误元素未找到 css 选择器。我已经解决了修改这个问题: var allOpts = (await driver.findElement(By.css(array[k])).getText()).trim()
    【解决方案3】:

    首先您需要阅读元素的文本,即使用getText()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多