-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面臨的問題,他沒有問過上面的問題。 –