Большой ответ заключается в том, чтобы не использовать xpath, а вместо этого использовать watir в качестве предназначенного для использования пользовательского интерфейса.
Когда речь идет о способе определения элементов в автоматизации браузера, в целом Xpath является злом, это МЕДЛЕННО, код, который он создает, часто (как вы находите) очень очень хрупок, и его почти невозможно прочитать и понять.Используйте его только в качестве крайней меры, когда больше ничего не будет работать.
Если вы используете Watir API (как с Watir или Watir-webdriver), то вы хотите идентифицировать элемент на основе его собственных атрибутов,например, класс, имя, идентификатор, текст и т. д. Если это не сработает, то определите, основываясь на ближайшем контейнере, который обертывает элемент, который может найти его уникальным образом.Если это не сработает, идентифицируйте родного брата или подэлемента и используйте метод .parent
как способ «подняться» к «родительскому элементу контейнера».
До хрупкостии трудную читаемость, сравните следующее, взятое из комментариев, и рассмотрите код, используя element_by_xpath для этого:
/html/body/form/div[6]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/p/table[2]/tbody/tr/td[2]/p/table/tbody/tr[3]/td[2]
, а затем сравните с этим (где весь код короче, чем только один xpath)
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:index => 1).text
или, чтобы быть немного менее хрупким, заменить индекс некоторым атрибутом ячейки, текст которого вы хотите
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:class => "balanceSnapShotCellRight").text
Пример xpath очень сложно понять, не зная, какой элементВы после или почему код может выбрать этот элемент.А так как значений индекса так много, любое изменение в дизайне страницы или просто дополнительные строки в таблице над той, которую вы хотите, нарушит этот код.
Второе гораздо проще понять, я могупросто прочитав, что скрипт пытается найти на странице, и как он его находит.Дополнительные строки в таблице или другие изменения в макете страницы не нарушат код.(за исключением перестановки столбцов в таблице, и даже этого можно было бы избежать, если бы я использовал класс или некоторую другую характеристику целевой ячейки (как это сделал пример в комментариях ниже)
В этом отношении, если использование класса является уникальным для этого элемента на странице, то
browser.cell(:class => 'balanceSnapShotCellRight').text
будет работать нормально, если в таблице есть только одна ячейка с этим классом.
Теперь, если честно, я знаю, что есть способы более элегантно использовать xpath для того, чтобы сделать что-то похожее на то, что мы делаем в приведенном выше коде Watir, но, хотя это и так, все равно не так легко читать и работать с, и это не то, как большинство людей обычно (неправильно) используют xpath для выбора объектов, особенно если они использовали устройства записи, которые создают хрупкий загадочный код xpath, аналогичный приведенному выше образцу)
Ответы на этот ТАК вопрос описать три основных подхода к идентификации элементов в Watir.Каждый ответ охватывает подход, который вы бы использовали, зависит от того, что лучше всего работает в данной ситуации.
Если вы находите проблему на данной странице, задайте здесь вопрос об этом и включите образецHTML до / после / вокруг элемента, с которым вы пытаетесь работать, и люди здесь, как правило, могут указать вам путь.
Если вы этого не сделали, изучите некоторые из учебников вWatir wiki , обратите внимание, как редко используется xpath.
Наконец, вы упоминаете Firewatir.Не используйте Firewatir, он устарел и больше не разрабатывается и не будет работать с любой последней версией FF.Вместо этого используйте Watir-Webdriver для драйвера Firefox или Chrome (или IE).