Хобрук: Ваш путь к мастерству в программировании

Селен ждать, пока метод

Я новичок в использовании Selenium и пытаюсь понять, как использовать метод ожидания на веб-сайте booking.com, чтобы дождаться отображения раскрывающегося списка, как на изображении. введите здесь описание изображения

Это код, с которым я работаю:

driver.get('http://booking.com')
driver.find_element_by_css_selector('#ss').send_keys("London")
WebDriverWait(driver,1).until('PLEASE SUGGEST WHAT TO INPUT')
driver.find_element(By.XPATH, """//*[@id="frm"]/div[2]/div/div[1]/ul[1]/li[1]""").click()

Используя инспектор Chrome, я не вижу никакого четкого селектора или элемента, который можно было бы использовать в круглых скобках для метода until. Когда я щелкаю правой кнопкой мыши по видимым параметрам и нажимаю «Копировать селектор», я получаю следующее:

#frm > div:nth-child(8) > div > div.c-autocomplete.sb-destination > ul.c-autocomplete__list.sb-autocomplete__list.-visible > li.c-autocomplete__item.sb-autocomplete__item.sb-autocomplete__item--city

Пожалуйста, может кто-нибудь предложить, что мне нужно сделать здесь.


Ответы:


1

Попробуйте этот код:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.maximize_window()


driver.get('http://booking.com')
driver.find_element_by_css_selector('#ss').send_keys("London")
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".search_hl_name")))
driver.find_elements(By.XPATH, "//*[@class ='search_hl_name']")[1].click() // you can use relative xpath in place of absolute one, replace index value at [1] with 0-4 which ever you want to select

Как справедливо заметил Андерссон, вам нужно увеличить тайм-аут.

28.03.2017
  • Спасибо большое. Как вы находите CSS-SELECTOR или XPATH с помощью инструментов инспектора/веб-разработчика в Chrome (или Firefox)? И как узнать, является ли это абсолютным или относительным XPATH? 28.03.2017
  • Если вы начинаете xpath с // и вводите только небольшие значения для поиска элемента, то его относительный xpath и в абсолютном xpath вы начинаете с /than/x/x/x/ что-то вроде этого, которое проходит через html. см. эту ссылку, она предоставит вам некоторую информацию. guru99.com/xpath-selenium.html 28.03.2017
  • Спасибо, кстати, отличный пост, теперь в закладках. 28.03.2017
  • Теперь у меня проблемы с нажатием на даты. Скажем, если я хочу щелкнуть сегодняшнюю дату, я пробовал: driver.find_element(By.XPATH, '//td[@class=c2-day c2-day-s-today]').click(), но это не так что-либо. Как мне найти XPath для этого? 28.03.2017
  • (//span[@class ='c2-day-inner' and text()='29'])[1] измените это значение 29 на дату, которую вы хотите выбрать, и [0] или [1] на основе первого месяца или второй месяц просмотра. Надеюсь это поможет 29.03.2017
  • Спасибо, но он все еще не работает. Это код, который я пробовал: driver.find_element(By.XPATH, '//span[@class=c2-day-inner and text=29]'[0]).click() Я получаю следующее сообщение об ошибке: selenium .common.exceptions.InvalidSelectorException: Сообщение: недопустимый селектор: Результатом выражения xpath / является: [объект HTMLDocument]. Это должен быть элемент. 29.03.2017
  • извините, это на самом деле то, что я пробовал: driver.find_element(By.XPATH, (//span[@class = 'c2-day-inner' and text()='29'])[0]).click() 29.03.2017
  • вместо использования find_element: driver.find_elements(By.XPATH, (//span[@class ='c2-day-inner' and text()='29']))[0].click() потому что мы делаем индексация, для которой требуется несколько элементов 29.03.2017

  • 2

    Вы можете попытаться подождать, пока один из раскрывающихся вариантов не станет активным с помощью ExpectedConditions:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    driver.find_element_by_css_selector('#ss').send_keys("London")
    WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//li[@class="c-autocomplete__item sb-autocomplete__item sb-autocomplete__item--city sb-autocomplete__item--two-lines "]')))
    

    Обратите внимание, что вторым аргументом, который вы передаете в WebDriverWait(), является время ожидания (в секундах), а 1 секунды может быть недостаточно, чтобы дождаться выполнения ожидания.

    Чтобы выбрать нужную опцию, вы можете использовать более подробный относительный XPath вместо абсолютного:

    driver.find_element(By.XPATH, '//li//b[text()="Central London"]').click()
    

    Это должно выбрать вариант с полужирным текстом «Central London». Просто замените "Central London" соответствующим значением, чтобы выбрать другой вариант.

    28.03.2017
  • Какое значение я бы поставил, чтобы иметь относительный XPath вместо абсолютного, если бы я хотел написать код, чтобы он щелкал первый вариант для любого введенного города? 28.03.2017
  • '//li[@class="c-autocomplete__item sb-autocomplete__item sb-autocomplete__item--city sb-autocomplete__item--two-lines "]' равно XPath для соответствия первому варианту 28.03.2017
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..