我一直在尝试通过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 //一个”}
我在哪里做错了?
答案 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);
}
}
}