经过一番折腾后,我想我找到了一个足够优雅和健壮的解决方案,至少可以处理页面刷新。
首先,我想既然我可以使用 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”的图像源,这是Google图像检索所特有的。然后,我将其存储在 Selenium 变量中,并使用确切的 src 来 clickAt。不幸的是,这是偶然的,因为同一个图像在三个不同的 div 中重复,并且不知道哪一个实际上会在顶部。
Then我找到了这个帖子:如何在 JavaScript 中使用 x,y 坐标模拟点击? https://stackoverflow.com/questions/3277369/simulate-a-click-by-using-x-y-coordinates-javascript
由于我可以使用 Selenium 函数计算出地图的 X 和 Y 偏移量,因此我可以简单地运行 document.elementFromPoint() 来获取(我假设)如果您单击该 x 和 y 位置,您自然会单击的任何元素。我现在的步骤是:
- 获取我的地图 div 的左侧和顶部位置。
- 获取将在这些坐标处单击的元素。
- 将此元素的 id 设置为唯一的值。
- 使用带有此 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 = "selenium-gmap"</td>
<td>dummy</td>
</tr>
<tr>
<td>clickAt</td>
<td>id=selenium-gmap</td>
<td>200,100</td>
</tr>
这至少可以在 Firefox 9.0.1 中运行,这对我来说已经足够好了。请注意,该解决方案取决于可用性 http://www.quirksmode.org/dom/w3c_cssom.html#documentviewdocument.elementFromPoint 函数的。