Отличается ли xpath для разных браузеров?

У меня очень забавная проблема. У меня есть xpath, через который я получаю значение.

Ex.

System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText().toString());

В firefox и Chrome он дает один и тот же текст, а в IE он дает другой текст.

Есть ли разница между xpath разных браузеров или это другая проблема, которую я не понимаю.


person OPTIMUS    schedule 14.04.2014    source источник
comment
Что ж, ответ не совсем да и не совсем нет. IE не имеет собственного движка XPath, поэтому вместо него Selenium использует движок на основе Javascript, который называется Wicked Good XPath. Поэтому вы можете получить несоответствия - в конце концов, это JS-реализация того, что есть в большинстве других браузеров. Другое дело - различная поддержка элементов в браузерах. Распространенным является свойство placeholder в некоторых элементах (HTML5) - ‹IE9 будет отображать его как отдельный элемент, тогда как другие - нет. Таким образом, ваш XPath должен будет учесть разницу - требуется дополнительная информация !!!   -  person Arran    schedule 14.04.2014
comment
getText () должен возвращать строку согласно документации (selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/). Так что вам, вероятно, не понадобится .toString () в конце   -  person Andrejs    schedule 20.02.2016


Ответы (5)


Узнайте, как Selenium обрабатывает Xpaths здесь.

В Chrome и Firefox я щелкнул правой кнопкой мыши тот же элемент DOM (как описано здесь), выбрал" копировать Xpath ", и вот что я получил:

Chrome: // * [@ id = "js-pjax-container"] / div 2 / div 2 / form / button

Firefox (с Firebug): / html / body / div [4] / div 2 / div 2 / div 2 / form / button.

(один со значением атрибута, а другой (FF) - абсолютный путь, который демонстрирует, что FF не понимает Xpath, сгенерированный Crhome)

Итак, для целей тестирования Selenium это имеет значение между браузерами. (Я не тестировал в IE)

Я запустил это

 @Test
        public void testGitHubButton(){
        WebDriver driver = new FirefoxDriver();
        driver.get("https://github.com/");
       String signup = driver.findElement(By.xpath("/html/body/div[4]/div[1]/div[1]/div[1]/form/button")).getText();
           Assert.assertEquals("Testing for string equality", "Sign up for GitHub", signup );
        driver.close();
        driver.quit();
        }

И тест проходит. Если я скопирую туда Xpath Chrome, это не удастся.

person Andrejs    schedule 20.02.2016

Для начала xpath создаются при разработке / тестировании. инженеры (SDET). Итак, создание эффективного xpath в основном зависит от инженеров-разработчиков / тестировщиков. Оптимизированный xpath должен работать идентично в случае < sizescross browser , а также кросс-платформенный тесты.


getText ()

getText() получает видимый (т.е. не скрытый CSS) текст этого элемента, включая подэлементы, т.е. возвращает видимый текст элемента.

java.lang.String getText()

Следовательно, вам не нужно явно приводить возвращаемый результат через toString(), и вы можете удалить его. Итак, ваша эффективная строка кода будет:

System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText());

Спецификация

Согласно проекту редактора WebDriver-W3C:

Команда «Получить текст элемента» предназначена для возврата текста элемента «в том виде, в каком он был обработан». Отображаемый текст элемента также используется для поиска элементов по тексту их ссылки и частичному тексту ссылки.

Одним из основных вкладов в эту спецификацию был проект Selenium с открытым исходным кодом. Это было широко распространено до написания этой спецификации, и поэтому определило ожидания пользователей относительно того, как должна работать команда Get Element Text. Таким образом, представленный здесь подход известен как ошибочный, но обеспечивает наилучшую совместимость с существующими пользователями.


Почему изменяется xpath элемента?

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


Решение

Общее решение этой проблемы - использовать css по возможности, поскольку браузеры лучше всего соответствуют строгим правилам таблицы стилей. Пара примеров:

  • Использование декларации HTML ‹! DOCTYPE›: все документы HTML должны начинаться с символа ‹! DOCTYPE ›декларация. Объявление не является тегом HTML. Это information для браузера о том, какой тип документа ожидать. В HTML 5 объявление выглядит так:

  • Использование сброса CSS: цель сброса таблицы стилей - уменьшить несогласованность действий браузера. например, высоту строки по умолчанию, поля и размер шрифта заголовков и т. д.

  • Использование clearfix: полезный метод очистки плавающих точек.


Этот вариант использования

В идеале, чтобы извлечь желаемый текст, вам нужно вызвать WebDriverWait для visibilityOfElementLocated(), и вы можете использовать следующий Стратегия поиска:

System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='error-box']/ul/li"))).getText());
person DebanjanB    schedule 14.12.2020

Они различаются для разных браузеров. Некоторые из них чувствительны к регистру, некоторые - нет. Согласно w3schools.com «К сожалению, существуют разные способы работы с XPath в Internet Explorer и других браузерах».

person Jeff White    schedule 07.08.2015

Разница только в числах [Index] в Xpaths между IE и Chrome. В IE индекс начинается с 0, но в Chrome индекс начинается с 1.
Пример:

если Xpath, который вы получили из Chrome,

/html/body/div[4]/div[3]/div[3]/div[1]/form/button 

тот же Xpath в Internet Explorer (IE) будет

/html/body/div[3]/div[2]/div[2]/div/form/button

(Примечание: div совпадает с div [0])

Поскольку в IE нет собственного механизма Xpath, поэтому вы можете скопировать Xpath из chrome и уменьшить индекс на единицу, как упоминалось выше, он отлично работает для меня в HTMLDocument, используя мой собственный метод преобразования xpath в теги IHTMLElement IE.

person vktn108    schedule 21.10.2018

Нет. XPath везде интерпретируются одинаково.

Возможно, вы захотите проверить метод getText ().

ИЛИ Вы можете проверить, вошли ли вы в какую-либо учетную запись в IE (а не в chrome / FF) или наоборот. НАПРИМЕР: вы получите другую DOM для google.com, а не для google.com (вошли в учетную запись google).

person bit    schedule 14.04.2014