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