Невозможно найти элемент и TimeoutException при использовании WebDriverWait

python-3.x selenium xpath webdriverwait xpath-1.0

19 просмотра

2 ответа

Я пытаюсь автоматизировать нажатие кнопки «ПОКАЗАТЬ БОЛЬШЕ» внизу страницы, чтобы получить все отзывы.

Тем не менее, у меня возникли некоторые проблемы с поиском, и я был бы очень признателен, если бы вы мне помогли.

Я попробовал несколько методов, но я не уверен, почему ни один из них не работает.

1) Метод 1: CSS-селектор

driver.find_element_by_css_selector("U26fgb.O0WRkf.oG5Srb.C0oVfc.n9lfJ.M9Bg4d")

приводит к:

NoSuchElementException: Message: no such element: Unable to locate element

2) Метод 2: XPath Helper (расширение для Chrome)

driver.find_element_by_xpath("/html/body[@id='yDmH0d']/div[@id='fcxH9b']/div[@class='WpDbMd']/c-wiz[@class='zQTmif SSPGKf I3xX3c drrice']/div[@class='T4LgNb']/div[@class='ZfcPIb']/div[@class='UTg3hd']/div[@class='JNury Ekdcne']/div[@class='LXrl4c']/div/div[@class='W4P4ne ']/div[2]/div[@class='PFAhAf']/div[@class='U26fgb O0WRkf oG5Srb C0oVfc n9lfJ']/span[@class='CwaK9']/span[@class='RveJvd snByac']")

приводит к той же ошибке, что и выше.

3) Способ 3: WebDriverWait

Я прочитал другие вопросы, связанные с переполнением стека, и попытался использовать WebDriverWait, и вот мой код:

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "/html/body[@id='yDmH0d']/div[@id='fcxH9b']/div[@class='WpDbMd']/c-wiz[@class='zQTmif SSPGKf  I3xX3c drrice']/div[@class='T4LgNb']/div[@class='ZfcPIb']/div[@class='UTg3hd']/div[@class='JNury Ekdcne']/div[@class='LXrl4c']/div/div[@class='W4P4ne ']/div[2]/div[@class='zc7KVe']/div[@class='d15Mdf bAhLNe']/div[@class='xKpxId zc7KVe']/div[@class='bAhLNe kx8XBd']/span[@class='X43Kjb']"))).click()

но столкнулся с TimeoutException

4) Я столкнулся с другим вопросом о смене фреймов, когда столкнулся с такими ошибками, но мне кажется, что у меня нет фрейма для переключения (исправьте меня, если я ошибаюсь)

Это URL страницы: https://play.google.com/store/apps/details?id=com.Daylight.EzLinkAndroid&hl=en_SG

HTML, с которым у меня проблемы, выглядит следующим образом:

<div class="PFAhAf" jscontroller="XO1Ihd" jsaction="JIbuQc:bRsdTc(i3y3Ic);">
      <div role="button" class="U26fgb O0WRkf oG5Srb C0oVfc n9lfJ M9Bg4d 
         j7nIZb" jscontroller="VXdfxd" jsaction="click:cOuCgd; 
         mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; 
         mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; 
         contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; 
         touchend:yfqBxc(preventMouseEvents=true|preventDefault=true); 
         touchcancel:JMtRjd;j9grLe:.CLIENT;HUObcd:.CLIENT" jsshadow="" 
         jsname="i3y3Ic" aria-disabled="false" tabindex="0">
               <div class="Vwe4Vb MbhUzd" jsname="ksKsZd" style="top: 17.2px; 
                     left: 70.225px; width: 98px; height: 98px;"></div>
               <div class="ZFr60d CeoRYc"></div><span jsslot="" class="CwaK9"> 
             <span class="RveJvd snByac">Show more</span>
             </span>
      </div>
</div>

Извините за длинный пост и спасибо за вашу помощь! :)

Автор: shannonk Источник Размещён: 12.06.2019 12:53

Ответы (2)


0 плюса

Поскольку элемент является элементом с поддержкой JavaScript, для click()него вам нужно вызвать WebDriverWait для, element_to_be_clickable()и вы можете использовать следующую стратегию локатора :

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@role='button']//span/span[text()='Show more']"))).click()
    
  • Примечание . Необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Автор: DebanjanB Размещён: 11.06.2019 09:10

0 плюса

Ваш yDmH0d, fcxH9bи т. Д. Создается динамически и меняется каждый раз, когда вы загружаете / перезагружаете страницу. Единственное, что не меняется - это span текст тега.

Поэтому я бы рекомендовал использовать следующий простой селектор:

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//span[text()='Show more']"))).click()

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

Также рассмотрите возможность использования шаблона проектирования Page Object Model : он облегчит вашу жизнь, когда дело доходит до поддержки тестирования, когда / где изменяется пользовательский интерфейс, и позволит вам писать тесты намного быстрее.

Смотрите страницу Объекты страницы документации Selenium Python для получения дополнительной информации, если это необходимо.

Автор: Dmitri T Размещён: 11.06.2019 12:48
Вопросы из категории :
32x32