单击下一步链接,直到分页在selenium webdriver中禁用下一步操作

时间:2017-05-02 23:54:44

标签: selenium

我希望通过分页导航每个页面来验证表中行中的元素。我能够导航到每个页面并断言元素但是问题是在最后一页,循环仍然继续,即使下一个链接显示为灰色。

禁用下一个链接时

  <span>
  <a class="next_btn inactive">NEXT ></a>
  </span>

启用下一个链接时

   <span>
   <a class="next_btn" href="home.do?action=Next&start=10&end=20&sort=&        
   type=00&status=&fromDate=04/02/2017&toDate=05/02/2017&school=&     
   district=0009">NEXT ></a>
   </span>

实际代码

  public void submissionType() throws Exception {
  driver.findElement(By.linkText("NEXT >"));
    while(true) {
        processPage();
        if (pagination.isDisplayed() && pagination.isEnabled()){
            pagination.click();
            Thread.sleep(100L);
        } else 
            break;

    } 
    }

  private void processPage() {
    String statusColumn="//td[@class='gridDetail'][2]";
    List<WebElement> list = table.findElements(By.xpath(statusColumn));
    for (WebElement checkbox : list) {
        String columnName=checkbox.getText();
        Asserts.assertThat(columnName,"File");  
     }
    }

2 个答案:

答案 0 :(得分:0)

不要使用By.linkText("NEXT >")标识元素,而是尝试使用By.cssSelector("a.next_btn")识别它。

当你使用这种方法时,当对象被禁用时,它的类名会改变,因此你的对象将不再被识别,你的循环就会中断。

编辑:添加try block和Catch NoSuchElement异常以避免异常。

答案 1 :(得分:0)

我知道你已经接受了答案,但其中一个陈述是不正确的。定位器By.cssSelector("a.next_btn")将同时找到启用和禁用按钮,因此不会导致循环中断。

查看您的代码,我会提供一些建议/更正。

  1. .isEnabled()只适用于INPUT标签,因此对此进行测试并不能真正完成任何事情。

  2. 使用Thread.sleep()不是一个好习惯。你可以谷歌一些解释但基本上问题是它是一个不灵活的等待。如果您要等待的元素在15ms内可用,您仍然需要等待10秒或任何睡眠设置。使用显式等待(WebDriverWait)是最佳做法。

  3. 我会清理你的功能并将它们写成

    public void submissionType()
    {
        WebDriverWait wait = new WebDriverWait(driver, 10);
        By nextButtonLocator = By.cssSelector("a.next_btn:not(.inactive)");
        List<WebElement> nextButton = driver.findElements(nextButtonLocator);
        while (!nextButton.isEmpty())
        {
            processPage();
            nextButton.get(0).click();
            wait.until(ExpectedConditions.stalenessOf(nextButton.get(0))); // wait until the page transitions
            nextButton = driver.findElements(nextButtonLocator);
        }
    }
    
    private void processPage()
    {
        for (WebElement checkbox : table.findElements(By.xpath("//td[@class='gridDetail'][2]")))
        {
            Asserts.assertThat(checkbox.getText(), "File");
        }
    }