【问题标题】:String comparisons in selenium using xpath fails even though both strings are exactly same即使两个字符串完全相同,使用 xpath 在 selenium 中进行字符串比较也会失败
【发布时间】:2017-09-26 18:03:54
【问题描述】:

我正在使用关键词驱动和数据驱动的框架。 预期字符串来自 excel 表,实际来自网页 即使两个变量打印完全相同的字符串,测试脚本仍然失败。 它对没有空格的字符串(如“Resign”)执行“PASS”,但对带有空格的字符串(如“Property Search”)执行“FAIL” 下面是打印PASS直到“Resign”的结果,然后它失败了 忽略用于调试的数字。 我还包括了结果中使用的 xpath。

结果生成
by.xpath:html/body/div[2]/div/div[2]/ul/li[1]/ul/li[1]
存在工具提示文本:- 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
出色的增强现实
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[contains(text(),'快速链接')]
存在工具提示文本:- 快速链接
快速链接
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;

}

【问题讨论】:

  • 请显示System.out.println("Tool tip text present :- " + toolTipText);System.out.println(data);结果
  • 加上两者都是 Stringsuse .equals() 而不是比较 2 个字符串。
  • 好吧,我已经尝试了所有的字符串比较方法,但它似乎不适用于某些数据,我也会用结果输出更新我的查询。如果你发现了一些事情,请告诉我谢谢
  • Okie 更新了查询!
  • 使用.equals()/后的结果是什么

标签: java css string selenium xpath


【解决方案1】:

对我有用的代码行

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

在使用此代码和调试后,我意识到从 excel 表传递的数据在两个字母之间有空格,而 webelement 工具提示上没有空格。但是我无法使用检查元素弄清楚它,因为它不可见. 在使用 replaceall("\s+","")

之前

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

在使用 replaceAll("\s+","") 并从来自 excel 表的数据中删除空间后

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

【讨论】:

    【解决方案2】:

    在我看来,你的函数试图做的太多了,而且对于你试图完成的简单任务来说过于复杂。我认为至少部分问题在于您使用的是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 值,然后查看差异在哪里。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-05
          • 1970-01-01
          • 2021-07-19
          • 1970-01-01
          相关资源
          最近更新 更多