2011-12-30 93 views
3

我無法創建Selenium測試用例來自動點擊Google地圖(特別是通過單擊地圖創建標記)。在IDE使用Selenium IDE點擊Google地圖

  1. 錄音功能的「記錄」功能記錄我的點擊鼠標

    <tr> 
        <td>click</td> 
        <td>//div[@id='map_canvas']/div[3]/div/div/div[4]/div/div/div[5]</td> 
        <td></td> 
    </tr> 
    

    當執行命令,這不僅給可見地圖視圖外的標記方式,但它在頁面刷新上也不可靠,因爲GMap嵌套div結構每次都會改變。

  2. clickAt

    Here有人建議使用clickAt與外界div的DIV,像這樣:

    <tr> 
        <td>clickAt</td> 
        <td>//div[@id='map_canvas']/div/div[1]</td> 
        <td>(400,300)</td> 
    </tr> 
    

    這並不在所有的工作。我已經嘗試了我能想到的click,clickAt和mouseDown/mouseUp的所有變體,但似乎沒有任何註冊。

我知道,谷歌已經發布了自己的Selenium test suites,但我無法弄清楚如何使用它我的優勢。任何幫助,將不勝感激!

編輯:這似乎是Google的方法(以及我找到的所有其他方法)不起作用的原因是因爲我使用的是Google Maps API的v3版本。谷歌自己的Selenium測試似乎在使用v2。

回答

4

經過大量的討論後,我想我找到了一個適當的優雅和強大的解決方案,至少可以處理頁面刷新。

首先,我覺得既然我可以用storeEval命令運行任意的JS,也許我可以利用JS的力量找到需要點擊的元素。我首先想到的是尋找實際的圖像,然後單擊它:

var imgs = window.document.getElementsByTagName("img"); 
str = ""; 
for (var i = 0; i<imgs.length; i++) { 
    if (imgs[i].src.match("GetMapImage")) { 
     str = imgs[i].src; 
     break; 
    } 
} 
str; 

上面的代碼搜索包含「GetMapImage」圖像源,這是特殊的谷歌的圖像檢索的所有圖像。然後,我將它存儲在一個Selenium變量中,並使用確切的src來單擊。不幸的是,這是一個難以置信的問題,因爲相同的圖像會在三個獨立的div中重複出現,並且不知道哪一個實際上位於頂部。

然後我發現這個職位:How to simulate a click by using x,y coordinates in JavaScript?

因爲我可以計算出X和Y使用Selenium功能抵消我的地圖,我可以簡單地運行document.elementFromPoint()得到(我假設)什麼當你點擊那個x和y位置時,你自然會點擊的元素。我現在的步驟是:

  1. 獲取我的地圖div的左側和頂部位置。
  2. 獲取將在這些座標點擊的元素。
  3. 將此元素的id設置爲唯一。
  4. 對此id使用clickAt函數。

我成功的硒代碼如下所示:

<tr> 
    <td>storeElementPositionLeft</td> 
    <td>id=map</td> 
    <td>left</td> 
</tr> 
<tr> 
    <td>storeElementPositionTop</td> 
    <td>id=map</td> 
    <td>top</td> 
</tr> 
<tr> 
    <td>storeEval</td> 
    <td>window.document.elementFromPoint(${left}, ${top}).id = &quot;selenium-gmap&quot;</td> 
    <td>dummy</td> 
</tr> 
<tr> 
    <td>clickAt</td> 
    <td>id=selenium-gmap</td> 
    <td>200,100</td> 
</tr> 

這,起碼,在Firefox 9.0.1,這是配不上我。請注意,此解決方案取決於document.elementFromPoint函數的availability

2

在id = map上使用elementFromPoint的建議不適用於我(Maps API 3和FireFox 15),因爲返回的map_canvas元素不響應單擊事件。

我發現的最佳逼近方式是使用IDE單擊錄製來獲取非常具體的畫布元素,然後在其中定位。使用clickAt extension簡化了位置。

的清潔的XPath通過硬編碼參考平鋪DIV /月,它成功地觸發我要找的點擊動作:

<tr> 
<td>clickAt</td> 
<td>//div[@id='map_canvas']//div[8]/canvas</td> 
<td>150,131</td> 
    </tr> 
<tr> 
    <td>clickAt</td> 
    <td>//div[@id='map_canvas']//div[4]/canvas</td> 
    <td>90,42</td> 
</tr> 
<tr> 
    <td>clickAt</td> 
    <td>//div[@id='map_canvas']//div[16]/canvas</td> 
    <td>108,53</td> 
</tr> 
1

對於測試環境(或少數幾個標記)您可以將優化的標記選項設置爲「false」。然後你可以使用Xpath選擇器。有一個性能成本。

查看對此問題的回答: Selenium tests for Google maps