单击<li>列表项不使用Selenium Java

时间:2017-04-07 02:11:34

标签: java list selenium

以下列表代表页面导航按钮:

<div class="list">
 <ul class="pageNav">
  <li class="paginate_button ">
   <a href="#" controls="Tables_Table_0" data-idx="0" tabindex="0">1</a></li>
  <li class="paginate_button ">
   <a href="#" controls="Tables_Table_0" data-idx="1" tabindex="0">2</a></li>
  <li class="paginate_button ">
   <a href="#" controls="Tables_Table_0" data-idx="2" tabindex="0">3</a></li>
 </ul>
</div>

例如,要转到第二页,我使用的是Selenium Java代码:

//after setting up webdriver
List<WebElement> li = driver.findElements(By.className("pageNav"));
System.out.println(li.get(2).getText());
li.get(2).click();

正确打印文本“2”,但没有正确点击或导航,就像我在实际网站上手动执行一样。我也尝试用以下实际链接替换链接: <a href="https://www.w3schools.com/html/">Visit our page</a>

但仍然没有运气。我做错了什么?

先谢谢你了!

3 个答案:

答案 0 :(得分:1)

尝试以下代码

    //getting all the anchor tag elements and storing in a list

    List<WebElement> links = driver.findElements(By.xpath("//ul[@class='pageNav']//li[starts-with(@class,'paginate_button')]/a"));
    System.out.println(links.size());

    //performs click on second links
    links.get(1).click();

答案 1 :(得分:1)

请尝试以下任何代码。

在您尝试过的代码中,我注意到您使用class定位器点击links元素。但是您的<ul>标记不包含该链接。在<ul>标记内,<li>标记存在,每个<li>标记包含单独的<a>标记。

所以,在这里你应该使用xpathcssSelector定位器。

方法1)使用xpath定位器

List<WebElement> links = driver.findElements(By.xpath("//ul[@class='pageNav']/li/a"));
System.out.println(links.size());

links.get(1).click(); //indexing start from 0, if you want to click on second link then pass indexing as 1.

建议:,而不是使用absolute xpath,请使用relative xpath

方法2)使用cssSelector定位器

List<WebElement> links = driver.findElements(By.cssSelector("ul.pageNav>li>a"));
System.out.println(links.size());

links.get(1).click(); //indexing start from 0, if you want to click on second link then pass indexing as 1.

答案 2 :(得分:1)

如果您遇到任何无法直接处理的异常困难,那么您可以先尝试使用操作类移动到该元素,然后单击它如下所示:

 WebElement we = driver.findElement(By.cssSelector("div.list > ul.pageNav li:nth-child(2));
 Actions action = new Actions(driver);
 action.moveToElement(we).click().build().perform();