После долгих сует, думаю, я нашел решение, которое в меру элегантное и достаточно надежное, чтобы хотя бы обрабатывать обновления страниц.
Во-первых, я решил, что, поскольку я могу запускать произвольный JS с помощью команды storeEval, возможно, я смогу использовать возможности 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 для нажатия на Att. К сожалению, это было ударом или промахом, потому что одно и то же изображение повторяется в трех отдельных делениях, и неясно, какой из них будет на самом деле сверху.
Тогда Я нашел этот пост: Как смоделировать щелчок, используя координаты x, y в JavaScript?
Поскольку я могу определить смещение X и Y моей карты, используя функции Selenium, я мог бы просто запустить document.elementFromPoint (), чтобы получить (я полагаю) любой элемент, на который вы бы естественным образом щелкнули, если бы вы щелкнули по этому x и у местоположения. Мои шаги сейчас:
- Получить левую и верхнюю позиции моей карты div.
- Получить элемент, по которому щелкают по этим координатам.
- Установите для идентификатора этого элемента нечто уникальное.
- Используйте функцию 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, что достаточно для меня. Обратите внимание, что это решение зависит от доступности функции document.elementFromPoint.