2013-04-26 56 views
15

我在Java中使用Selenium Webdriver。我想點擊「下一步」按鈕,從第1頁移動到2以下頁面後,得到當前的URL的代碼我有:硒在加載頁面後獲取當前URL

WebDriver driver = new FirefoxDriver(); 
    String startURL = //a starting url; 
    String currentURL = null; 
    WebDriverWait wait = new WebDriverWait(driver, 10); 

    foo(driver,startURL); 

    /* go to next page */ 
    if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){ 
     driver.findElement(By.xpath("//*[@id='someID']")).click(); 
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='someID']"))); 
     currentURL = driver.getCurrentUrl(); 
     System.out.println(currentURL); 
    } 

我有兩個隱性和顯性等待來電等待頁面在獲取當前網址之前完全加載。但是,它仍然會打印第1頁的網址(預計會是第2頁的網址)。

+0

BTW,該文檔(現在呢?)說不要混用隱性/明確的等待,由於它使等待時間無法預測。相關引用:_WARNING:不要混合隱式和顯式等待。這樣做會導致無法預測的等待時間。例如,設置10秒的隱含等待時間和15秒的顯式等待時間,可能會導致在20秒後發生超時。_來自:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits – mbafford 2017-08-01 11:27:20

回答

17

像你說的,因爲下一個按鈕的xpath是相同的每頁它不會工作。它的編碼工作是等待元素顯示,但由於它已經顯示,所以隱式等待不適用,因爲它不需要等待。你爲什麼不使用網址從你的代碼中改變的事實,它在下一個按鈕被點擊時會改變。我做C#,但我猜在Java中它會是這樣的:

WebDriver driver = new FirefoxDriver(); 
String startURL = //a starting url; 
String currentURL = null; 
WebDriverWait wait = new WebDriverWait(driver, 10); 

foo(driver,startURL); 

/* go to next page */ 
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){ 
    String previousURL = driver.getCurrentUrl(); 
    driver.findElement(By.xpath("//*[@id='someID']")).click(); 
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

    ExpectedCondition e = new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
      return (d.getCurrentUrl() != previousURL); 
      } 
     }; 

    wait.until(e); 
    currentURL = driver.getCurrentUrl(); 
    System.out.println(currentURL); 
} 
+0

我試過了,但出現一個錯誤,並說我需要使currentURL最終。但後來我無法更新它 – pew007 2013-04-26 18:45:09

+0

我不是Java開發人員,所以我不確定語法。你得到的錯誤聽起來像它可能是兩件事之一,或者你需要以某種方式將currentURL傳遞給預期的條件,我不知道該怎麼做,或者你需要一個不同的變量來存儲URL,因爲你稍後更改。我已經更新了最後一種方法的答案,你可以試試嗎? – ragamufin 2013-04-26 19:08:52

+0

你也可以嘗試聲明'lastURL'作爲最後的 – ragamufin 2013-04-26 19:12:12

0

自從我使用硒進行編碼已經有一段時間了,但您的代碼對我來說看起來還不錯。有一點需要注意的是,如果找不到元素,但超時已通過,我認爲代碼將繼續執行。所以,你可以做這樣的事情:

boolean exists = driver.findElements(By.xpath("//*[@id='someID']")).size() != 0 

什麼上面布爾回報?你確定硒實際導航到預期的頁面? (這可能聽起來像一個愚蠢的問題,但你真的看着頁面改變...硒可以遠程運行,你知道...)

+0

當我看着它時,硒實際上導航到下一頁。我想我已經明白爲什麼它不起作用。這是因爲我傳入的xpath是每個頁面上的「下一個」按鈕的xpath。所以我不能使用它來阻止驅動程序等待下一頁加載......如果這對您有意義。但是,我不明白爲什麼隱式調用不起作用。有沒有其他解決方法? – pew007 2013-04-26 18:05:05

1

Page 2是在一個新的標籤頁/窗口? 如果是這種情況,使用波紋管代碼:

try { 

    String winHandleBefore = driver.getWindowHandle(); 

    for(String winHandle : driver.getWindowHandles()){ 
     driver.switchTo().window(winHandle); 
     String act = driver.getCurrentUrl(); 
    } 
    }catch(Exception e){ 
    System.out.println("fail"); 
    }