Selenium xpath没有这样的元素异常,即使它在firepath中工作

时间:2016-12-12 04:00:27

标签: selenium xpath selenium-webdriver selenium-firefoxdriver

这是我使用Firebug

检查元素时的样子

enter image description here

当我在xpath中尝试相同的语法时,它选择结果页面2.我在selenium IDE中尝试了相同的方法并单击了find,它在执行代码时选择结果页面2。我正在接受没有这样的元素异常

Xpath语法://a[contains(@href,'/jobs?q=qa+engineer&l=Renton%2C+WA&start=10')]/span[contains(@class,'pn')][text()='2']

public void jobSearch(){
        WebDriver driver= new FirefoxDriver();
        driver.get("https://www.indeed.com");
        driver.findElement(By.id("what")).sendKeys("QA Engineer");
        driver.findElement(By.id("where")).clear();
        driver.findElement(By.id("where")).sendKeys("Seattle,WA");
        driver.findElement(By.id("fj")).click();
        driver.manage().timeouts().implicitlyWait(25, TimeUnit.SECONDS);

        driver.findElement(By.xpath("//a[contains(@href,'/jobs?q=qa+engineer&l=Renton%2C+WA&start=10')]/span[contains(@class,'pn')][text()='2']")).click();

感谢您抽出宝贵的时间和宝贵的建议。

3 个答案:

答案 0 :(得分:5)

实际上有3个错误:

  1. 最大的错误,脚本无法找到下一页的可见选项。 在给定的截图中,运行给定代码的结果。这就是脚本无法找到元素的原因。
  2. Selenium Webdriver脚本仅适用于Visible Area

    enter image description here

    解决方案:

    添加步骤向下滚动网页

    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("window.scrollBy(0,1000)", "");
    
    1. Xpath不是一般化的。它用于获取2 num页面上放置的URL。因此改变如下:

      //div[@class='pagination']//span[text()='2']

    2. 有一些中断,如弹出式广告,基于区域的网址。所以编写代码就像给定消除未来的错误一样:

      public void jobSearch()   {
      
      
          try{
              WebDriver driver= new FirefoxDriver();
              driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
              driver.manage().window().maximize();
              driver.get("https://www.indeed.com");
              try
              {
                  //Here region based URL gets open so remove it if it is directly open www.indeed.com
                  driver.findElement(By.linkText("www.indeed.com")).click();
              }
              catch (Exception e)
              {
      
              }
              driver.findElement(By.id("what")).sendKeys("QA Engineer");
              driver.findElement(By.id("where")).clear();
              driver.findElement(By.id("where")).sendKeys("Seattle,WA");
              driver.findElement(By.id("fj")).click();
              try
              {
                  // After this one pop up gets open so close it
                  driver.findElement(By.xpath("//button[@id='prime-popover-close-button']/span")).click();
              }
              catch (Exception e)
              {
      
              }
              //pageDown(driver.findElement(By.id("searchCount")), 2);
              JavascriptExecutor jse = (JavascriptExecutor) driver;
              jse.executeScript("window.scrollBy(0,1000)", "");
              //driver.findElement(By.xpath("//a[contains(@href,'/jobs?q=qa+engineer&l=Renton%2C+WA&start=10')]/span[contains(@class,'pn')][text()='2']")).click();
              driver.findElement(By.xpath("//div[@class='pagination']//span[text()='2']")).click();
              // Now continue you code here
          }
          catch (Exception e)
          {
              e.printStackTrace();
          }   }
      
    3. 注意:请阅读GeckoDriver for Firefox和Chromedriver for Chrome浏览器 Selenium 3.0+版本

答案 1 :(得分:0)

尝试使用以下XPath:

//div[@class='pagination']/a/span[text()='2'] 

注意: 2 - 适用于2nd page link。根据您想要的页码更改它

答案 2 :(得分:0)

因为该元素当时可能尚未在DOM中加载,并且您正在搜索该元素之后使用wait语句。但必须在元素的操作和搜索之前添加wait语句