-1

我一直在尝试通过硒自动化浏览器操作,目标是 - 将打开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(); 
} 

,但什么也没发生,我得到一个错误 - 在线程

错误异常“主要” org.openqa.selenium.NoSuchElementException:找不到元素: {“method”:“xpath”,“selector”:“// ol [@ id ='rso'] // div [1] // div [1] // div // h3 // a” }

我在哪里做错了?

回答

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(); 
+0

我确定xpath是唯一的问题在这里..上面的票有这个问题的解决方案 driver.findElement(By.xpath(“// ol [@ id ='rso']/div [1]/div [1]/div/h3/a“))。点击() 这是正确的xpath –

+0

不管你使用'/'还是'//'都不会有什么区别。两者都返回相同的结果。但是为了编码标准,你的xpath格式是合适的。但是,如果以不同的方式查看它,那么使用'//'应该会更有帮助,如果所有元素都在这些html元素之间。 –

0

由于您尝试在加载之前单击第一个链接(gmail),您会收到错误信息。更新您的代码以实施wait,直到搜索到某物后加载该元素并单击搜索按钮。在硒中有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 

另一种更好的方式来处理,这是等待元素出现,并保持投票的页面,如果该元素出现了用流利的等待。下面是如何 -

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()方法。我不喜欢这是因为它可能会在元素需要较长时间加载时抛出错误,因为硒会等待您指定的预定义时间,这是一种糟糕的编码标准。以下是如何 -

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(); 

希望它有帮助。

0

我看到我的动态ID都被使用,但不建议使用的动态ID [因为它会不断变化],也可以采取必要的等待条件,以避免这种例外

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); 
     } 
     } 
} 

控制台输出,

TestNG] Running: 
    C:\Users\Mohan Raj S\AppData\Local\Temp\testng-eclipse-1635948262\testng-customsuite.xml 

element is visible [[FirefoxDriver: firefox on WINDOWS (6d5bc9d3-cdff-4831-991a-69d7d7ce3d36)] -> xpath: //a[contains(text(),'Gmail')]] 
PASSED: methoda 

=============================================== 
    Default test 
    Tests run: 1, Failures: 0, Skips: 0 
=============================================== 


=============================================== 
Default suite 
Total tests run: 1, Failures: 0, Skips: 0 
=============================================== 
+0

'“lst-ib”'不是OP面临的问题,他没有问过上面的问题。 –