Google maps 使用Selenium IDE点击谷歌地图
我无法创建一个Selenium测试用例来自动点击GoogleMaps(特别是通过点击地图来创建标记)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> 点击 /
<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结构每次都会更改<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 = "selenium-gmap"</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选择器。这会带来性能成本
请参见此问题的答案: