Selenium - получение информации, чей тег связанного веб-элемента продолжает изменяться - PullRequest
0 голосов
/ 14 февраля 2019

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

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

Ниже приведены фрагменты кода и кода для того же элемента для резервного копирования моей заявки.

enter image description here

HTML с тегом <li>:

<li id="result_0" data-asin="0128023074" class="s-result-item celwidget  ">

HTML с тегом <div>:

<div data-asin="0128023074" data-index="0" class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28" data-cel-widget="search_result_0"><div class="sg-col-inner">

Я все еще новичок в Selenium, поэтому, чтобы справиться с этой проблемой, я использую следующий фрагмент кода и уверен, что есть лучший способ справиться с этим.

try:
    book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "result_0")))
    book_detail(book, details)
except TimeoutException:
    book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-index=\"0\" and @data-cel-widget=\"search_result_0\"]")))
    book_detail_by_div(book, details)

Может кто-нибудь, пожалуйста, помогите мне понять, почему тег связан с такими изменениями, а также как справиться с такой ситуацией?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я следовал подробностям, указанным в вопросе, и https://www.amazon.com искал текст В книге воспроизведения данных и аналитики отображался тот же элемент.

Итак, ваше наблюдение с <div> тег был верным.Однако я не нашел подходящего тега <li> рядом с результатами поиска.

Решение

Чтобы определить нужный элемент, вам нужно вызвать WebDriverWait для visibility of element located(), и вы можете использовать любое из следующих решений:

  • Использование CSS_SELECTOR:

    book = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.sg-col-inner h5 a:first-child")))
    
  • Использование XPATH:

    book = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='sg-col-inner']//h5//following::a[1]/span")))
    
0 голосов
/ 14 февраля 2019

На ваш первый вопрос о том, почему это произошло, я не уверен.Я пробовал разные ОС / браузер и размеры окон, но не смог воспроизвести регистр div элементов.

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

try:
    book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[(@id="result_0") or (@data-index="0" and @data-cel-widget="search_result_0")]')))
except TimeoutException:
    print("Did not find search result")
else:
    # So atleast one of the tag type is visible.
    # Even if the attribute is not present then it will return None.
    if book.get_attribute('id') == "result_0":
        book_detail(book, details)
    else:
        book_detail_by_div(book, details)
...