Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用xpath在selenium中进行字符串比较失败,即使两个字符串完全相同_Java_Css_String_Selenium_Xpath - Fatal编程技术网

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

Java 使用xpath在selenium中进行字符串比较失败,即使两个字符串完全相同,java,css,string,selenium,xpath,Java,Css,String,Selenium,Xpath,我使用的是关键字驱动和数据驱动框架。 预期字符串来自excel工作表,实际字符串来自网页 即使两个变量打印完全相同的字符串,测试脚本仍然失败。 它对没有空格的字符串(如“辞职”)执行“通过”,但对有空格的字符串(如“属性搜索”)执行“失败” 下面是打印通过直到失败后“辞职”的结果 忽略用于调试的数字。 我还包括了结果中使用的xpath 生成的结果 By.xpath:html/body/div[2]/div/div[2]/ul/li[1]/ul/li[1] 存在工具提示文本:-Revals Rev

我使用的是关键字驱动和数据驱动框架。 预期字符串来自excel工作表,实际字符串来自网页 即使两个变量打印完全相同的字符串,测试脚本仍然失败。 它对没有空格的字符串(如“辞职”)执行“通过”,但对有空格的字符串(如“属性搜索”)执行“失败” 下面是打印通过直到失败后“辞职”的结果 忽略用于调试的数字。 我还包括了结果中使用的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[contains(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;

}

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

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

if(toolTipText.trim().contentEquals(data.trim()))
或者您可以尝试使用规范化空格删除制表符、回车符和换行符

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

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

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

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

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

这里,字符串
未完成AR
将在
replaceAll
之后变为
未完成AR
。这当然是一种过分的杀伤力,但如果它起作用,那么很明显字符串中的空格是导致问题的原因。

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

一行代码对我有效

if(toolTipText.replaceAll("\\s+","").equalsIgnoreCase(data.trim().replaceAll("\\s+","")))
在使用此代码和调试后,我意识到从excel工作表传递的数据在两个字母之间有空格,而webelement工具提示上没有空格。但是,我无法使用inspect元素来解决这个问题,因为它不可见。 在使用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
ManageDashboard

请显示
System.out.println(“存在工具提示文本:-“+工具提示文本”)
系统输出打印项次(数据)
resultsplus因为两者都是字符串使用
.equals()
来比较两个字符串。我已经尝试了所有的字符串比较方法,但似乎对某些数据不起作用。我还将使用结果输出更新查询。如果你有什么发现,请告诉我谢谢Sokie更新了查询!使用.equals()后的结果是什么/