首页 > 解决方案 > 为什么我的代码会产生不同的结果

问题描述

我正在通过 Selenium(使用 Java 编程语言)学习自动化,并且正在研究一个测试用例。在我的案例中,最后一步涉及使用 来检查按钮和页面是否存在,findElement.By.xpath我有两个版本的步骤。无论使用哪个版本,我的整个测试用例都通过了。但是,这两个版本各自生成不同的结果。如果我使用带有 int 的第一个版本,我会得到“不存在写评论按钮”的结果。如果我使用带有布尔值的第二个版本,我会得到“写评论按钮”存在!由于测试用例通过,并且第二个版本生成“按钮存在”结果,问题不可能出在 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 :( ");

}

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

标签: javaselenium-webdriver

解决方案


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


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

  • 代码:

    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;

解决方案

理想情况下,您需要:

  • 诱导WebDriverWaitvisibilityOfAllElementsLocatedBy().
  • 评估size()通过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 :( ");
    

奥特罗

Operator Precedence

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

运算符优先级


推荐阅读