2013-03-20 82 views
0

我想讓Selenium,特別是WebDriver v2.31與Google Maps進行交互。我只需單擊[第一個]「獲取路線」按鈕即可輸入一對地址,然後單擊兩個地址下的「獲取路線」按鈕。這導致了一組行車路線。我不能做的是讓Selenium滾動到「路線」面板的底部,以便我可以看到目的地和「保存到我的地圖」鏈接。我不知道是否由於瀏覽器生成滾動條而出現問題。讓Selenium WebDriver在谷歌地圖方向面板中向下滾動

我能夠在Yahoo!上執行搜索。並滾動到結果網頁的底部;我認爲這是因爲網頁架構中沒有其他框架或面板。儘管如此,瀏覽器生成了滾動條,而不是網頁。

我可以使用鼠標按住並向下拖動滾動條來構建一個Action。我不喜歡這種解決方案,因爲如果頁面大小不同或面板大小不同,則會導致大量重新計算來執行此操作。我更喜歡與Yahoo!中的單個「文檔」窗口類似的解決方案。或Google代碼。

任何幫助將不勝感激。過去三天,我一直在網上搜尋解決方案。

謝謝。

史蒂夫

附錄: 如下文所述。我不是想要對地圖本身做任何事情,而是試圖對包含方向的面板進行操作。我使用的是Google地圖,因爲它與稍後需要測試的應用程序類似。我需要能夠讓[Selenium] WebDriver滾動到面板的底部,以便我可以選擇「下一步」鏈接 - 就像滾動到Google地圖中的「路線」面板的底部並在底部看到「保存」鏈接。

我不確定在使用術語面板時是否使用了正確的術語。問題在於它顯示面板在顯示網頁時動態生成滾動條。

driver.switchTo().frame(driver.findElement(By.id("spsizer"))); 
JavascriptExecutor js = (JavascriptExecutor)driver; 
js.executeScript("javascript:window.scrollBy(250,750)", element); 
driver.switchTo().defaultContent(); 

不幸的是,「面板」不包含在框架或框架...作爲確定由硒返回的異常:

Exception in thread "main" org.openqa.selenium.NoSuchFrameException: Element is not a frame element: DIV 

我相信我已經確定,面板上有ID(「spsizer」)使用FireBug。

這也不起作用:

element = driver.findElement(By.id("spsizer")); 
JavascriptExecutor js = (JavascriptExecutor)driver; 
js.executeScript("javascript:window.scrollBy(250,750)", element); 

這只是執行無需滾動即可路線面板的底部,但它也不會拋出異常。

回答

1

我可以保存我的地圖鏈接下面的屏幕截圖給出的代碼。

沒有必要有一個記錄的步驟向下滾動面板,Selenium可以找到並對網頁中的任何Web對象執行操作,而不會被用戶看到。代碼的

enter image description here

詳細說明:

LINE6:命令 - waitForVisible // DIV [@ ID = 'dir_sr']/A [@ ID ='srlink ']

我已經加入waitForVisible這樣Selenium會在連接前等待5秒保存到我的地圖是可見的。這會在按下按鈕後給頁面加載足夠的同步時間。 // DIV [@ ID = 'dir_sr']/A [@ ID = 'srlink']是鏈接中的XPath定位器保存到我的地圖

Line7:命令 -點擊 // DIV [@ ID = 'dir_sr']/A [@ ID = 'srlink']

點擊鏈接保存到我的地圖

Line8:命令 -點擊//屁股在[@ ID = 'srsave']

點擊按鈕保存

C#.NET的webdriver對於相同的代碼。請注意,必須提供Google帳戶用戶名和密碼才能保存地圖鏈接。

using System; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading; 
using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium.Support.UI; 

namespace SeleniumTests 
{ 
    public class GoogleMapSavingTest 
    { 
      static void Main(string[] args) 
      { 
       IWebDriver driver = new FirefoxDriver(); 
       driver.Navigate().GoToUrl("https://maps.google.com.au/"); 
       driver.FindElement(By.Id("d_launch")).Click(); 
       driver.FindElement(By.Id("d_d")).Clear(); 
       driver.FindElement(By.Id("d_d")).SendKeys("Franklin, ACT"); 
       driver.FindElement(By.Id("d_daddr")).Clear(); 
       driver.FindElement(By.Id("d_daddr")).SendKeys("Gungahlin, ACT"); 
       driver.FindElement(By.Id("d_d")).Click(); 
       driver.FindElement(By.Id("d_sub")).Click(); 
       for (int second = 0;; second++) 
       { 
        if (second >= 60) Assert.Fail("timeout"); 
        try 
        { 
         if (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break; 
        } 
        catch (Exception) 
        {} 
        Thread.Sleep(1000); 
       } 
      driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click(); 
       driver.FindElement(By.Id("Email")).SendKeys("UserName"); 
       driver.FindElement(By.Id("Passwd")).SendKeys("Password"); 
       driver.FindElement(By.Id("signIn")).Click(); 
       for (int second = 0; ; second++) 
       { 
        if (second >= 60) Assert.Fail("timeout"); 
        try 
        { 
         if (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break; 
        } 
        catch (Exception) 
        { } 
        Thread.Sleep(1000); 
       } 
      driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click(); 
      driver.FindElement(By.XPath("//button[@id='srsave']")).Click(); 


      } 





} 

}

+0

感謝您的建議,但我沒有使用Selenium IDE。當我試圖通過WebDriver選擇鏈接時,我得到一個異常,說鏈接不可見[因爲我沒有滾動到面板的底部]。 – Steve 2013-03-21 19:08:38

+0

試用WebDriver中的邏輯 - C#.Net程序我已更新,它的工作原理。不需要向下滾動WebDriver以識別「保存到我的地圖」網頁鏈接。 – CheryJose 2013-03-22 00:30:05

+0

感謝您的代碼片段。這解決了我的問題(在我必須測試的真實應用程序上)。下面是我落得這樣做: '如果(driver.findElement(By.className( 「// DIV [@類= 'GKN']/A [@類= 'GWT-錨GHN']」))isDisplayed(。 。))\t \t \t \t driver.findElement(By.className( 「// DIV [@類= 'GKN']/A [@類= 'GWT-錨GHN']」))點擊();' 但從長遠來看,我仍然需要弄清楚如何滾動動態生成的滾動條,因爲我可能只需要在面板上部分滾動查看內容即可。 – Steve 2013-03-22 14:22:31

0

我知道Selenium有一個擴展,有人在GitHub上爲自動化地圖應用程序創建了一個擴展,但我不記得如何找到它。雖然我在幾周前瀏覽GitHub時看到了它,但它通過javascript使用圖像識別(我不是指Sikuli)。我認爲如果你看起來足夠努力,你所尋找的東西就存在。

如果您使用的是遠程網格,我會避免使用Sikuli,否則它可能適用於您。另外,當涉及到iframe時,在放棄自動化框架之前總是嘗試JavaScriptExecutor(帶有switchTo框架)是一個好主意。

在此之前,您可以先看看WebDriverJS。另外,即使只是想法,GhostDriver也許值得一看。

+0

謝謝你的潛在客戶,但我不希望自動化的地圖功能。我試圖讓Selenium WebDriver在面板中確認瀏覽器生成的滾動條,就像Selenium在其視圖窗口內容太多的普通香草(沒有面板或框架)網頁中所做的那樣。我之所以選擇谷歌地圖是因爲它的可訪問性和流行度,我可以找到另一個沒有地圖但仍然顯示信息的網站。 – Steve 2013-03-21 14:53:29

+0

哦,我明白了。這很容易。你需要使用driver.switchTo().frame(frameId)。最新版本的webdriver會自動滾動(我相信),當您切換到該框架時使用findElement。 – djangofan 2013-03-21 15:09:44

+0

我是否在調用該區域時使用了正確的術語「面板」[其中顯示了轉彎行駛方向]?或者這仍然是一個框架?我熟悉框架,但只有那些不顯示/隱藏的框架。你能告訴我我會在Google Maps頁面源中找到frameId嗎?我一直在尋找最後兩天嘗試不同的ID。再次感謝。 – Steve 2013-03-21 17:48:16