链接无法在网页自动化期间打开硒

时间:2015-10-04 12:50:34

标签: java selenium selenium-webdriver automation nosuchelementexception

我一直在尝试通过selenium自动执行浏览器操作,目标是 - google.com将被打开,gmail文本将被搜索,第一个链接将被点击并打开。使用的代码是 -

public static void main(String[] args) {
        WebDriver driver= new FirefoxDriver();
        driver.get("https://www.google.co.in");
        driver.manage().window().maximize();
        WebElement searchbox= driver.findElement(By.id("lst-ib"));
        searchbox.sendKeys("gmail");
        driver.findElement(By.name("btnG")).click();
        driver.findElement(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a")).click();
}

但没有发生任何事情,我收到了错误 -

  

错误 - 线程“main”中的异常   org.openqa.selenium.NoSuchElementException:无法找到元素:   { “方法”: “的xpath”, “选择器”: “//醇[@ ID = 'RSO'] // DIV [1] // DIV [1] // // DIV H3 //一个”}

我在哪里做错了?

3 个答案:

答案 0 :(得分:1)

代码中的Xpath格式错误:

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

请使用以下Xpath完美运行。

  WebDriver driver= new FirefoxDriver();
            driver.get("https://www.google.co.in");
            driver.manage().window().maximize();
            WebElement searchbox= driver.findElement(By.id("lst-ib"));
            searchbox.sendKeys("gmail");
            driver.findElement(By.name("btnG")).click();
          driver.findElement(By.xpath("//ol[@id='rso']/div[1]/div[1]/div/h3/a")).click();

Xpath我修改的是。

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

答案 1 :(得分:0)

您收到错误是因为您尝试在加载之前单击第一个链接(gmail)。更新代码以实现wait,直到搜索完内容后加载元素并单击搜索按钮。在Selenium中有许多类型的wait,使用显式等待在两个动作之间等待,它是我最喜欢的方法。这是怎样的 -

driver.findElement(By.name("btnG")).click();
(new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a"))).click(); //explicitly wait for the element to load and then click

另一个更好的方法是等待元素出现并在元素出现时使用Fluent等待继续轮询页面。这是怎样的 -

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class); //create a fluent wait object
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a"))).click(); //fluent wait until element loads

您还可以使用隐式等待时间。在硒执行的每个动作之后等待预定义的时间。但它又是一个不可取的,因为它可能会在网页性能缓慢时抛出错误。这是怎样的 -

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //implicitly wait until element loads for predefined time
driver.get("https://www.google.co.in");

但是,解决您问题的最简单方法是使用简单的sleep()方法,我不喜欢使用sleep()方法。我不喜欢它,因为它可能会在元素需要更长时间加载时抛出错误,因为selenium会等待您指定的预定义时间,这是一个糟糕的编码标准。这是怎样的 -

driver.findElement(By.name("btnG")).click();
Thread.sleep(5000); //Use sleep() method to wait for a predefined time
driver.findElement(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a")).click();

希望它有所帮助。

答案 2 :(得分:0)

我看到我的动态ID被使用了,不建议使用动态ID [因为它会不断变化],也使用必要的等待条件来避免这种异常

       MapView mapView = new MapView(this, 256); //constructor
       mapView.setClickable(true);
       mapView.setBuiltInZoomControls(true);
       setContentView(mapView); //displaying the MapView
       mapView.setTileSource(TileSourceFactory.MAPQUESTOSM);
       mapView.getController().setZoom(15); 
       mapView.getController().setCenter(new GeoPoint(mLat, mLon));
       mapView.setUseDataConnection(true); 
       mapView.setMultiTouchControls(true);

我试图复制您的方案,没有发现任何问题,请在下面找到编码,

driver.findElement(By.id("lst-ib")); //lst-ib is dynamic value. 

控制台输出,

package testclasses;

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.*;
import org.testng.annotations.*;

public class classa extends classparent {

    @Test
 public void methoda() throws InterruptedException {
      driver.manage().window().maximize();
      driver.get("https://www.google.co.in/"); 


      WebDriverWait wait = new WebDriverWait(driver, 10);
      wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(text(),'Gmail')]")));

      WebElement close = driver.findElement(By.xpath("//a[contains(text(),'Gmail')]"));


      if(close.isDisplayed()){
         System.out.println("element is visible " +close);
         close.click();
      }

      else{
          System.out.println("element is not visible " +close);
      }
      }
}