Google maps 使用Selenium IDE点击谷歌地图

Google maps 使用Selenium IDE点击谷歌地图,google-maps,selenium,Google Maps,Selenium,我无法创建一个Selenium测试用例来自动点击GoogleMaps(特别是通过点击地图来创建标记) IDE中的记录功能 “记录”功能将我的鼠标点击记录为 <tr> <td>click</td> <td>//div[@id='map_canvas']/div[3]/div/div/div[4]/div/div/div[5]</td> <td></td> </tr> 点击 /

我无法创建一个Selenium测试用例来自动点击GoogleMaps(特别是通过点击地图来创建标记)

  • IDE中的记录功能

    “记录”功能将我的鼠标点击记录为

    <tr>
        <td>click</td>
        <td>//div[@id='map_canvas']/div[3]/div/div/div[4]/div/div/div[5]</td>
        <td></td>
    </tr>
    
    
    点击
    //div[@id='map_canvas']/div[3]/div/div/div[4]/div/div/div[5]
    
    执行该命令时,这不仅会将标记路径放置在可见地图视图之外,而且页面刷新也不可靠,因为GMap嵌套的div结构每次都会更改

  • 点击

    建议将clickAt与外部div的div一起使用,如下所示:

    <tr>
        <td>clickAt</td>
        <td>//div[@id='map_canvas']/div/div[1]</td>
        <td>(400,300)</td>
    </tr>
    
    
    点击
    //div[@id='map_canvas']/div/div[1]
    (400,300)
    
    这根本不起作用。我已经尝试了我能想到的各种各样的click、clickAt和mouseDown/mouseUp,但似乎没有任何效果

  • 我确实知道谷歌已经发布了他们的产品,但我不知道如何利用它来发挥我的优势。任何帮助都将不胜感激


    编辑:谷歌的方法(以及我发现的所有其他方法)不起作用的原因似乎是因为我使用的是谷歌地图API的v3。谷歌自己的Selenium测试似乎正在使用v2。

    经过大量的讨论,我想我找到了一个适度优雅、足够健壮的解决方案,至少可以处理页面刷新

    首先,我想既然我可以用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;
    
    var-imgs=window.document.getElementsByTagName(“img”);
    str=“”;
    对于(var i=0;i
    上面的代码在所有图像中搜索包含“GetMapImage”的图像源,这是谷歌图像检索的特殊功能。然后我会将其存储在Selenium变量中,并使用准确的src进行单击。不幸的是,这是命中或未命中的,因为同一张图像会在三个单独的分区中重复,并且不知道哪一个分区实际位于顶部

    然后我找到了这个帖子:

    因为我可以使用Selenium函数计算出地图的X和Y偏移量,所以我可以简单地运行document.elementFromPoint()来获取(我假设)如果单击X和Y位置,您自然会单击的任何元素。我现在的步骤是:

  • 获取地图分区的左侧和顶部位置
  • 获取将在这些坐标处单击的元素
  • 将此元素的id设置为唯一的
  • 使用具有此id的clickAt功能
  • 我成功的selenium代码如下所示:

    <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>
    
    
    storeElementPositionLeft
    id=地图
    左边
    storeElementPositionTop
    id=地图
    顶部
    仓库
    window.document.elementFromPoint(${left},${top}).id=“selenium gmap”
    笨蛋
    点击
    id=硒gmap
    200,100
    

    这至少可以在Firefox 9.0.1中使用,这对我来说已经足够好了。请注意,此解决方案取决于document.elementFromPoint函数的性能。

    在id=map上使用elementFromPoint的建议对我不起作用(Maps API 3和Firefox 15),因为返回的map\u画布元素不会响应单击事件

    我发现最好的近似方法是使用IDE单击录制来获取非常特定的画布元素,然后在其中定位。使用简化的方法也可以获取位置

    清理后的xpath带有对平铺div/canvas的硬编码引用,它成功地触发了我正在寻找的单击操作:

    <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>
    
    
    点击
    //div[@id='map\u canvas']//div[8]/canvas
    150,131
    点击
    //div[@id='map\u canvas']//div[4]/canvas
    90,42
    点击
    //div[@id='map\u canvas']//div[16]/canvas
    108,53
    
    对于您的测试环境(或少量标记),您可以将标记选项优化设置为“false”。然后您可以使用Xpath选择器。这会带来性能成本

    请参见此问题的答案: