Webdriver не находит элемент страницы по xpath

У меня похожая проблема, но элемент по одному XPath находится, а по другому - нет.
Вот такой код работает:

public static void SelectRandomTypeOfDocument()
        {
            Browser.Click(OpenListOfTypes);
            Browser.Click(Browser.FindElement(By.XPath("//li[text()='Элемент']")));
        }

а если пробую найти таким образом:

public static void SelectRandomTypeOfDocument()
        {
            Browser.Click(OpenListOfTypes);
            Browser.Click(Browser.FindElement(By.XPath("//div[contains(@style,'top')]//li[4]")));
        }

то уже выдаётся ошибка:

Test(s) failed. OpenQA.Selenium.NoSuchElementException : Unable to find element with xpath == //div[contains(@style,'top')]//li[4]

Хотя Firepath по этому XPath элемент находит. Первый был сделан просто чтобы проверить, виден ли вообще этот элемент. Получается, что виден, а проблема в XPath. Мне принципиально надо найти именно по второму XPath, т.к. элементы выбираются случайным образом.

Вот код самой страницы:

<div id="editDocumentForm:types_list_b1ee69a2-8390-4466-b8ae-7bcdda6bb948_panel" class="ui-selectonemenu-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow" style="z-index: 1006; display: block; top: 275px; left: 697px;">
  <div class="ui-selectonemenu-items-wrapper" style="height:auto">
    <ul class="ui-selectonemenu-items ui-selectonemenu-list ui-widget-content ui-widget ui-corner-all ui-helper-reset">
      <li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="111">111</li>
      <li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="222"">222</li>
      <li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="333">333</li>
      <li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Элемент">Элемент</li>
    </ul>
  </div>
</div>

Что можно сделать, подскажите?

  1. Интересно насколько стабильно повторяется проблема, бывают ли случаи когда тест проходит
  2. Также интересно поведение в разных браузерах
  3. Для исследования проблемы попробуй поставить sleep между этими строками. Если заработает, значит просто гонки. Вероятнее всего div не успевает появиться (сменить style на top). А в первом случае работает, потому что элемент ищется без div
  1. Пока сколько раз пробовал, всегда такое поведение

  2. В фаерфоксе работает, а в эксплорере - нет.

  3. Пробовал Thread.sleep(3000);
    Результат такой же.

Я пробовал смотреть исходиники в эксплорере, там вообще нет top - все разделы, и активные, и неактивные, выглядят одинаково.

В Firefox нормально работает? Оба xpath? Ну тогда надо либо сделать xpath более общим (чтоб он работал во всех браузерах), либо определять xpath в зависимости от браузера, под которым происходит работа тестов

Потому что у вас стили на элементе апплаются через CSS - поэтому можете забыть про @style в IE, за исключением инлайновых стилей.
Либа для Xpath в IE парсит исключительно сорс страницы.
Если критично используйте CssSelector - там со стилями будет все ок.

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

Пробовал по CssSelector, но результат такой же:

Test(s) failed. OpenQA.Selenium.NoSuchElementException : Unable to find element with css selector == div[style*='top'] li:first-child

А хіба в тебе “top” добавляється в стайл не на mouseover? Є сенс робити moveToElement() на дівку, тоді пошук по стайлу спрацює. І весь список буде доступний.

Нет, top добавляется выборе элемента, когда элемент отмечается галочкой и выпадающий список под ним становится активным. В диве три параметра - id, class и style. Когда элемент не выбран, style="", а когда выбран, добавляются некоторые значения, в том числе и “top”. Но это в фаерфоксе, а в эксплорере параметра style в div’е вообще нет, только id и class.

Зачем ты тогда по style элемент ищешь?

1 лайк

Смотрите в таб Style - http://i.msdn.microsoft.com/dynimg/IC485176.png

В сорсе в этом случае вы ничего не увидите.

1 лайк

Дійсно, шукай тоді по XPath дочірній список чекнутого елемента. Як тобі так?

1 лайк

Придумал как обойти использование style в xpath. Я просто запоминаю порядковый номер дива, который выбираю рандомом, а потом ищу его по классу и по этому номеру.
Проблема устранена. Всем спасибо )