使用xpath的selenium中的字符串比较失败,即使两个字符串完全相同

时间:2017-04-28 14:59:21

标签: java css string selenium xpath

我正在使用关键字驱动和数据驱动框架。 预期字符串来自excel表和实际来自网页 即使两个变量都打印完全相同的字符串仍然测试脚本失败。 对于没有空格的字符串,如“辞职”,它会“通过”,但对于带有“物业搜索”的空格的字符串,它会“失败” 下面是打印PASS直到“Resign”失败后的结果 忽略它用于调试的数字。 我还在结果中包含了xpath。

生成结果
By.xpath:html / body / div [2] / div / div [2] / ul / li [1] / ul / li [1]
提供工具提示文字: - Revals
Revals
1 By.xpath:html / body / div [2] / div / div [2] / ul / li [1] / ul / li [2] / a [contains(text(),'Managed Client Accounts')] <登记/> 提供工具提示文本: - 托管客户帐户
托管客户帐户
1
By.xpath:html / body / div [2] / div / div [2] / ul / li [1] / ul / li [3]
出现工具提示文字: - 辞职
辞职
1
By.xpath:.// [@id='dashboard-dropdown']/li[4]/a
提供工具提示文字: - 杰出的AR
优秀AR
4
By.xpath:.//
[@id='menuCreateDashboard']
提示工具提示文字: - 管理仪表板
管理控制台
4
By.xpath:html / body / div [2] / div / div [2] / ul / li [2] / a
提供工具提示文字: - 物业搜索
房产搜索
4
By.xpath:html / body / div [2] / div / div [2] / ul / li [3] / a
提供工具提示文本: - 税务资源数据库
税务资源数据库
4
By.xpath:html / body / div [2] / div / div [2] / ul / li [4] / a [包含(text(),'Quick Links')]
提供工具提示文字: - 快速链接
快速链接
4
这是代码:

public String verify_Text(String locatorType, String value, String data){
       try
  {
     By locator;
     locator = locatorValue(locatorType, value);
     System.out.println(locator);
     WebElement element = driver.findElement(locator);


     //WebElement element = driver.findElement(By.cssSelector("#header>h1 a"));
    // Get tooltip text
    String toolTipText = element.getText();
    System.out.println("Tool tip text present :- " + toolTipText);
    System.out.println(data);

    // Compare toll tip text

         if(toolTipText.contentEquals(data))
           {
               System.out.println("1");
              return PASS;

           }



  }
  catch(Exception e)
  {
     LOG.error(Executor.currentSheet + ":" + e);
     getScreenshot("verify_Link", data);
     System.out.println("3");
     return FAIL;
  }
  getScreenshot("verify_Link", data);
  System.out.println("4");
  return FAIL;

}

4 个答案:

答案 0 :(得分:1)

为我工作的代码行

if(toolTipText.replaceAll("\\s+","").equalsIgnoreCase(data.trim().replaceAll("\\s+","")))

我意识到在使用这段代码后调试是从excel表传递的数据在两个字母之间有空格,而webelement工具提示上没有空格。但是这个我无法使用inspect元素弄清楚它是不可见的。 在使用replaceall之前(&#34; \ s +&#34;,&#34;&#34;)

By.xpath:html / body / div [2] / div / div [2] / ul / li [1] / ul / li [5] / a 提供工具提示文字: - ManageDashboard 管理仪表板

使用replaceAll(&#34; \ s +&#34;,&#34;&#34;)并从excel表格中删除数据空间

By.xpath:html / body / div [2] / div / div [2] / ul / li [1] / ul / li [5] / a 提供工具提示文字: - ManageDashboard ManageDashboard

答案 1 :(得分:0)

我没有足够的评论来评论,但我建议尝试一些事情:

你可以修剪字符串,也许有一个字符串在其中一个字符串中不可见。

if(toolTipText.trim().contentEquals(data.trim()))

或者您可以尝试使用 normalize-space 来删除制表符,回车符和换行符。

/*/a[normalize-space() = 'Hello World']

答案 2 :(得分:0)

有时,当您从WebElements获取文本时,它们往往会在其中包含前导或尾随空格。更好的比较是

toolTipText.trim().equals(data.trim())

如果这仍然不起作用,可以从字符串中删除所有空格然后进行比较。像这样:

toolTipText = toolTipText.trim().replaceAll("\\p{Z}", "");
data = data.trim().replaceAll("\\p{Z}", "");
toolTipText.equals(data)

此处,字符Outstanding AR将在OutstandingAR之后变为replaceAll。这当然是一种矫枉过正,但如果它有效,那么很明显,字符串中的空格是导致问题的原因。

答案 3 :(得分:0)

在我看来,你的功能试图做得太多,而且对于你想要完成的简单任务来说过于复杂。我认为至少部分问题在于您使用的是contentEquals()而不是equals()

您正在使用Java。有一个很棒的库可以处理你想要用它做的所有不同的比较,称为JUnit。使用它来进行比较并清理代码,您可以使用如下代码。

String expectedTooltip = "some value from Excel";
By locator = By.cssSelector("#header > h1 a");
getScreenshot("verify_Link", expectedTooltip);
Assert.assertEquals("verify tooltip", expectedTooltip, getTooltip(locator));

和一个支持函数,它只从定位器指定的元素中获取工具提示。您不想传递字符串并将其转换为定位器。请改用By类。它使事情变得更简单。我在这里添加了.trim()以消除字符串两端的任何非预期空格。

public String getTooltip(By locator)
{
    return driver.findElement(locator).getText().trim();
}

如果您仍然遇到字符串不匹配的问题,那么在执行比较之前,您必须删除/替换某些字符串中可能存在不可打印的字符。解决这个问题的一种方法是遍历每个字符串并打印每个字符的ASCII值,并查看差异的位置。