获取错误NoSuchElementException:无法找到元素:在“big.findElement(By.xpath(”// * [@ id ='rso'] / div [1] / div / div / h3 / a“))中。单击( );”

时间:2017-01-07 14:03:12

标签: java eclipse selenium-webdriver

package FlipPkg;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class BigBasket {

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver","C:\\Users\\NP031997\\Downloads\\geckodriver-v0.12.0-win64\\geckodriver.exe");
    WebDriver big = new FirefoxDriver();
    big.get("https://www.google.com/");
    big.manage().window().maximize();
    System.out.println("The webpage is:" + big.getTitle());

    big.findElement(By.xpath(".//*[@id='gs_htif0']")).sendKeys("Big Basket");
    big.findElement(By.xpath(".//*[@id='gs_htif0']")).sendKeys(Keys.ENTER);
    big.findElement(By.xpath("//*[@id='rso']/div[1]/div/div/h3/a")).click();

    System.out.println("The current webpage is:" + big.getTitle());

    }
}

代码在位置失败

big.findElement(By.xpath("//*[@id='rso']/div[1]/div/div/h3/a")).click();

1 个答案:

答案 0 :(得分:0)

您的代码很好.WebDriver肯定会找到该元素,但您在该代码中遇到一个小问题。 NoSuchElementException可能有两个原因:

  1. WebDriver不会延迟查找您在代码中找到的链接。 WebDriver不会等待加载搜索结果页面,因此您将获得NoSuchElementException。
  2. 链接的xpath可能会动态变化,因为Google会检索动态搜索结果。
  3. 解决方法如下:

    您必须在“输入”功能后使用等待。

    1. 您可以使用waits或waitForPageToLoad()函数。以下代码适用于WebDriverWait。

      <!DOCTYPE html>
      <html>
      
        <head>
          <script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
        </head>
      
        <body>
          <script>
        
          var svg = d3.select('body')
            .append('svg')
            .attr('width',600)
            .attr('height',500);
            
          svg.append('circle')
            .attr('class', 'apple')
            .attr('r', 200)
            .attr('cx', 200)
            .attr('cy', 250)
            .style('fill', 'black');
            
          svg.append('circle')
            .attr('class', 'orange')
            .attr('r', 200)
            .attr('cx', 400)
            .attr('cy', 250)
            .style('fill', 'black');
        
          var t = d3.transition()
            .duration(7000)
            .ease(d3.easeLinear)
            .tween("attr.fill", function() {
              var apple = d3.selectAll(".apple"),
                  orange = d3.selectAll(".orange"),
                  i1 = d3.interpolateRgb(apple.style("fill"), "red"),
                  i2 = d3.interpolateRgb(orange.style("fill"), "orange");
              return function(t) {
                apple.style("fill", i1(t));
                orange.style("fill", i2(t));
              };
            });
        </script>
        </body>
      
      </html>
    2. 您可以使用它来点击

      元素
      WebDriverWait wait = new WebDriverWait(big,120);
      wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='rso']/div[1]/div/div/h3/a"));
      
    3. 您还可以使用Contains()函数来查找元素的XPath:

      WebDriverWait wait = new WebDriverWait(big, 15);
      wait.until(ExpectedConditions.elementToBeClickable(By.partialLinkText("Big Basket")));
      
    4. 通过使用第二和第三种方法,您将获得一个元素列表,因为许多元素包含Text Big Basket。