Java 为什么我的代码会产生不同的结果

Java 为什么我的代码会产生不同的结果,java,selenium-webdriver,Java,Selenium Webdriver,我正在通过Selenium(使用Java编程语言)学习自动化,并且正在编写一个测试用例。本例的最后一步涉及使用findElement.by.xpath检查页面中是否存在按钮,我有两个版本的步骤。对于任何一个版本,我的整个测试用例都通过了。但是,这两个版本各自生成不同的结果。如果我使用第一个版本,使用int,我会得到“Write review button'not Existence”结果。如果我将第二个版本与布尔值一起使用,我会得到“Write review button”存在 由于测试用例通过

我正在通过Selenium(使用Java编程语言)学习自动化,并且正在编写一个测试用例。本例的最后一步涉及使用
findElement.by.xpath
检查页面中是否存在按钮,我有两个版本的步骤。对于任何一个版本,我的整个测试用例都通过了。但是,这两个版本各自生成不同的结果。如果我使用第一个版本,使用int,我会得到“Write review button'not Existence”结果。如果我将第二个版本与布尔值一起使用,我会得到“Write review button”存在 由于测试用例通过了,并且第二个版本生成了“button exists”结果,所以问题不可能出在xpath上,因此第二个版本得到错误结果的问题一定是在逻辑上,但我无法判断它是什么

我多次尝试重新运行该案例,以查看问题是否为小故障,但结果相同。我试着在网上找到类似的问题,但找不到任何能确切说明我的问题是如何错误的东西

int i = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size();
if (i > 0)  { System.out.println("'Write review button' exists!"); }
else        { System.out.println("'Write review button' does not exist :( ");
}


您拥有的两个代码实例本质上是相同的,我认为没有理由让它们执行不同的操作。我猜这是个时间问题。为了使其行为更加一致,我将添加一个等待查看按钮。由于按钮有时可能不在那里,它将抛出超时异常,因此您需要捕获该异常,以便每次运行都有一个干净的通过/失败。为此,我将使用下面的函数,该函数根据等待后元素是否存在返回布尔值

public static boolean elementExists(By locator, int timeout)
{
    try
    {
        new WebDriverWait(driver, timeout).until(ExpectedConditions.presenceOfElementLocated(locator));

        return true;
    } catch (Exception e)
    {
        return false;
    }
}
上面的方法测试元素的“存在性”,也就是说,它是否存在于DOM中?如果要确保它实际上是可见的(而不仅仅是存在的),则需要将
.presenceOfElementLocated()
更改为
.visibilityOfElementLocated()

由于您是Selenium新手,我还建议您使用一个公共库来进行验证,如JUnit或TestNG。这将使您不必编写自己的自定义代码进行验证,也不必经历在自己的自定义代码中查找bug的过程。使用JUnit,您将使用

Assert.assertTrue("Verify the review button exists", elementExists(By.xpath("//ul[@class='comments_advices']"), 10));

请参阅。

两个代码块之间存在一些差异


显然,您的第一个代码块在逻辑上是正确的,如下所示:

  • 代码:

    int i = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size();
    if (i > 0)  
        System.out.println("'Write review button' exists!"); 
    else
        System.out.println("'Write review button' does not exist :( ");
    
  • 输出:

    Write review button' does not exist
    
但它并不完美,我将在后面的讨论中解释这一点


您的第二个代码块有点欺骗性,因为它在同一行中包含两个逻辑运算符,而您将它留给编译器来决定哪一个明显偏离了最佳实践。您可能很幸运,因为
=
具有更高的优先级,例如:

boolean reviewButtonPresent = driver.findElements(By.xpath("//ul[@class='comments_advices']")).size() > 0;

解决方案 理想情况下,您需要:

  • 将WebDriverWait导入到AllelementsLocatedBy()的
    可见性中
  • 通过
    if()
  • 示例代码:

    if (new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@class='comments_advices']"))).size()>0) 
        System.out.println("'Write review button' exists!"); 
    else 
        System.out.println("'Write review button' does not exist :( ");
    

奥特罗 :

下表中的运算符按其优先顺序列出。运算符越靠近表的顶部,其优先级越高。优先级较高的运算符在优先级相对较低的运算符之前求值。同一行上的运算符具有相同的优先级。当同等优先级的运算符出现在同一表达式中时,必须有一条规则来控制首先求值的运算符。除赋值运算符外,所有二进制运算符都从左到右求值;赋值运算符从右向左求值


感谢您的分析。既然你说这两个实例本质上是一样的,那么你在代码中看到错误了吗?没有,我没有看到任何错误。。。改进的地方,但没有错误。reviewButtonPresent=true您的意思是==对吗?请注意,在检查布尔值时,只需转到
if(someCondition)
并避免==true或==false的内容。您的代码除了将第一行放在
if
内外,与OP没有任何不同。您添加了等待,我已经介绍过了,但OP询问的是存在性而不是可见性。然后你发布了大量关于运算符优先级的内容,这些内容与这个问题无关。那么,你的回答补充了什么?
if (new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@class='comments_advices']"))).size()>0) 
    System.out.println("'Write review button' exists!"); 
else 
    System.out.println("'Write review button' does not exist :( ");