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

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

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

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

введите здесь описание изображения

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)

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


person Dhiwakar Ravikumar    schedule 14.02.2019    source источник


Ответы (2)


Что касается вашего первого вопроса о том, почему это произошло, я не уверен. Я пробовал разные размеры ОС/браузера и окна, но не смог воспроизвести случай с элементами 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)
person Kamal    schedule 14.02.2019

Я следил за подробностями, указанными в вопросе, и при https://www.amazon.com поиске текста The Data and Analytics playbook отображался тот же элемент.

Итак, ваше наблюдение с тегом <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")))
    
person DebanjanB    schedule 23.02.2019