Как выбрать второй элемент div в XPath?

2

Я пытаюсь выбрать div который выделен синей полосой:

Изображение 207116

Это второй div на странице, который содержит текст "All", поэтому моя попытка следующая:

all_button = driver.find_element_by_xpath("//div[contains(., 'All')][2]")

По какой-то причине, когда я запускаю свою программу, это выбирает div, выделенный желтым цветом. Я попытался использовать string() и text() вместо периода в секции contains(), но он дает тот же результат. Есть идеи?

Теги:
xpath
selenium

2 ответа

2
Лучший ответ

замещать

//div[contains(., 'All')][2]

с

(//div[contains(., 'All')])[2]

чтобы выбрать второй такой div а не ограничивать такие элементы div во второй дочерней позиции.

Вы можете еще более затянуть предикат, чтобы использовать строковое равенство, а не сдерживание подстроки (чтобы избежать совпадения <div>All good men</div>, например), если ваши данные действительно показаны:

(//div[.='All'])[2]
  • 0
    Второй кусок кода, который вы предложили, (//div[.='All'])[2] , работал отлично. Как ни странно, (//div[contains(., 'All')])[2] выбрал "Бронза" вместо "Все". HTML-код, содержащий «Bronze», по структуре идентичен коду, показанному выше для «Platinum». div который содержит «Bronze» (в пределах span ), расположен непосредственно ниже div который содержит «All».
  • 0
    Да, учтите, что строковое значение элементов div предка также будет содержать All in //div[contains(., 'All')] .
1

Вы можете попробовать быть более строгим с вашим выбором, добавив условие:

all_buttons = driver.find_element_by_xpath(
          "//class[contains(@class, 'filter-option selected') and contains(text(), 'All')]")

Теперь для отладки проверьте размер возвращаемого списка:

print(len(all_buttons))

Если размер списка кнопок "Все", полученный в соответствии с DOM, вы должны делать все.

  • 0
    Это, вероятно, сработает, за исключением того, что это только «опция фильтра», если я еще не нажал на один из других фильтров. «Все» является случаем по умолчанию, поэтому моя первая попытка обойти эту проблему состояла в том, чтобы сначала просто получить данные из категории «Все», прежде чем переходить к остальным фильтрам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню