2014-01-14 2 views
1

Я устал от поиска вручную локаторов (id, xpath, css, linkText и т. Д.) Для веб-элементов из моего источника веб-страницы. Он также потребляет больше усилий. Поэтому, чтобы избежать этого, я хочу написать код, который напрямую взаимодействует с источником страницы и генерирует детали локаторов (например, id = «xyz», xpath = «html/body/table/tr/td/a» и т. Д.) Чтобы достичь это, я думаю, я могу сгенерировать локатор ID с помощью функции split() объекта String. Но, что я не знаю, как создать xpaths, css и linkText локаторы для всех компонентов страницы? Может ли кто-нибудь помочь мне с этим?Selenium 2: поиск локаторов веб-элементов программно

ответ

1

Хотя я обычно рекомендую самостоятельно создавать выражения XPath (так как вы можете лучше использовать вещи для обработки таких атрибутов класса), вероятно, наиболее разумным и удобным способом способом определения выражений XPath для селена является используйте функцию «Поиск XPath» Firebug или Chrome Developer Tool. Они оба по меньшей мере используют атрибуты @id, чтобы сократить выражения XPath.


Если вы хотите написать код самостоятельно, например. для встраивания в другие инструменты, которые вы используете, вы можете взглянуть на ответы «PHP XML - Find out the path to a known value», которые решают проблему на PHP, или другую с ответами на Javascript: «Javascript get XPath of a node».

Если вы используете какие-либо инструменты, которые не работают с DOM (инструменты Selenium/Firebug/Chrome Dev/JavaScript будут работать), следите за проблемами, описанными в «Why does my XPath query (scraping HTML tables) only work in Firebug, but not the application I'm developing?».

+0

Спасибо, Дженс .. В этом решении я мог бы получить пути xpath и Id. Но, я также хочу иметь css-путь узла. Как я могу получить это из источника страницы? – star95

+0

Я не знаю пути, но сам пишу код. Вы можете легко изменить код генерации XPath или даже перевести выражения XPath. –

+0

Я бы порекомендовал учиться писать xpath или css, а не генерировать код. Вы можете использовать Chrome или Firefox «автоматически обнаружить» xpath, но я бы не предложил использовать его – Major

0

В настоящее время нет «инструментов», которые делают даже незначительную порядочную работу по синтезу надежных и сжатых локаторов xpath или css. Я писал селен и HTML/CSS-код практически для всей отрасли, а так называемые CASE-методы, которые претендуют на эту работу лучше, чем люди, производят смехотворно ошибочный вывод чаще, чем при создании полезного материала. Однако я бы добавил codicil: есть надежда.

Просматривая различные методы XPath и CSS (см. http://www.w3schools.com/xpath/xpath_axes.asp для некоторых общих рекомендаций) и используя только самые минимальные строки локатора, которые пройдут в Firebug, Selenium IDE и других подобных плагинах, можно прогрессировать постепенно к лучшему подходу. В общем случае (по возможности) следует использовать только один компонент из списка атрибутов объекта и избегать использования динамически определенных величин. Лучшие практики поощряют выбор класса, имени или идентификатора только в том случае, если они являются «неизменными».

Mutability - сложная проблема: просто перетаскивание курсора над объектом или щелчок по нему могут изменить характеристики класса или css. Иногда это можно преодолеть, используя только «фиксированную» часть атрибута оскорбления. Например, сначала класс может быть «tabContent», но когда курсор помещается над соответствующим объектом, он может измениться на «tabContentMouseOver». Вы поняли эту идею. Используя строку поиска xpath // * [содержит (@ class, 'tabContent')], вы стоите лучше, чем даже вероятность попадания на нужный объект, независимо от того, щелкнули ли он, выделили или даже отключили.

Следующий «трюк», который я бы рекомендовал вам рассмотреть, использует принцип «приятель»; многие объекты (в частности, подобные кнопкам) в настоящее время состоят из изображения без динамических свойств, обернутых div, который управляет своим действием, управляемым событиями. Для таких ситуаций вы можете обнаружить, что // div [@ eventproxy = 'tabObject']/follow :: img [содержит (@ src, 'tabImage') и text() = 'Contents'] или что-то подобное будет охватывать все базы , Содержание, конечно, будет зависеть от вашей ситуации.

Необходимо энергичное использование методов иерархических осей («следующий» - это тот, который я использую довольно часто), но только там, где это необходимо; иногда вместо этого будет '//'.

Начисляйте себя за каждый ненужный персонаж и вознаграждайте себя за методы, которые являются краткими и могут вызывать частые и серьезные изменения кода. Прежде всего, настойчиво.

В целом я избегаю использования «чистых» локаторов CSS по следующей причине: они никогда не были предназначены как локаторы. «Каскадные таблицы стилей» по самой своей природе предназначены для воздействия на максимальное количество веб-объектов и очень редко уникальны для любой части контента. Веб-кодировщики, как известно, изменяют их «на лету» для создания новых эффектов или реструктуризации контента в соответствии с требованиями клиентов; почему вы используете тесты, которые, как известно, колеблются? Кроме того, все, что может сделать CSS (и я имею в виду ВСЕ), также можно сделать внутри XPaths, если вы так решите.

Устойчивость к тому, что XPaths «медленнее», чем методы CSS. Я считаю, что недостаточно часто опровергалось, что его нужно принимать с несколькими столовыми ложками соли. Тем не менее, если вы действительно чувствуете себя более комфортно с техникой CSS, пойдите для этого! Опыт будет воспитывать вас лучше, чем любая реклама, которую вы найдете в stackoverflow.

Смежные вопросы