#selenium
#селен
Вопрос:
Я пытаюсь использовать селен для выполнения следующих действий:
- Откройте веб-сайт
- Нажмите на поле поиска
- Введите «Сиэтл» в поле поиска
- Выберите первый результат из предложенных результатов
Мой код завершается ошибкой на шаге 2. Идентификатор класса для поля поиска «class = input_search ng-нетронутый ng-действительный ng-пустой ng-тронутый»
Вот мой код:
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() url = 'https://wego.here.com/' driver.get(url) driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').click() driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').send_keys('Seattle') driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').send_keys(Keys.ENTER)
Любые предложения будут высоко оценены!
ДОПОЛНИТЕЛЬНЫЙ ВОПРОС
Благодаря @Prophet я смог выполнить первый автоматический щелчок и автоматическое заполнение, но когда я пытаюсь выполнить ту же задачу с другим полем поиска, ему это не нравится. Пожалуйста, обратитесь к следующему коду, который я добавил к существующему коду:
подождите.пока(EC.visibility_of_element_located((С помощью.CSS_SELECTOR, «button.btn»))). send_keys(Ключи.ВОЙДИТЕ)
подождите.пока(EC.visibility_of_element_located((По.CSS_SELECTOR, «ввод.маршрут_итем_инпут_0»))).нажмите() подождите.пока(EC.visibility_of_element_located((По.CSS_SELECTOR, «ввод.маршрут_итем_инпут_0»))).send_keys («Чикаго») подождите.пока(EC.visibility_of_element_located((По.CSS_SELECTOR, «ввод.routinary_item_input_0»))). send_keys(Ключи.ВОЙДИТЕ)
кнопка.btn действительно работала, но не вход.routinary_item_input_0. Вот исходный скриншот:
Комментарии:
1. Ну, прежде всего, проверьте, уникален ли этот класс, и, честно говоря, никогда не используйте классы такого типа, поскольку они используются для проектирования, поэтому они, вероятно, не уникальны, либо используйте xpath для элемента, либо идентификатор, если он доступен
2. Пожалуйста, дайте мне знать, решил ли мой ответ ваши проблемы?
Ответ №1:
Вы используете неправильный локатор.
ng-empty
и ng-touched
, возможно, не всегда будет там.
Так что вместо
driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').click()
Попробуйте использовать это:
driver.find_element_by_css_selector('input.input_search').click()
input.input_search
является уникальным, стабильным локатором для этого элемента.
Кроме того, вы должны добавить задержку, предпочтительно для использования ожидаемых условий, как показано ниже:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() wait = WebDriverWait(driver, 20) url = 'https://wego.here.com/' driver.get(url) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.input_search"))).click()
Комментарии:
1. Спасибо! Если я правильно понял, первый ввод из «input.input_search» определяет тег ввода в css, а input_search-это то , что вы можете найти в переменной класса. Однако, когда я пытаюсь выполнить ту же задачу с другим полем поиска с другим локатором, это работает по-другому, поэтому мне интересно, правильно ли я понимаю. Пожалуйста, обратитесь к правке, которую я внес в свой пост, для справки. Спасибо за вашу помощь!
2. Если я понимаю, что вы имеете в виду, нет. Способ создания правильного локатора состоит в том, чтобы найти минимальную уникальную комбинацию значений атрибута элемента, которая будет однозначно соответствовать этому элементу. Таким образом, для этого конкретного элемента класс input_search даст минимальное уникальное совпадение именно для этого элемента. Для других элементов иногда вам нужно будет использовать их значение идентификатора или несколько значений класса или какое-либо другое значение атрибута. Часто возникает необходимость использовать какой-либо родительский элемент и атрибуты дочернего элемента, чтобы найти дочерний элемент.
Ответ №2:
wait=WebDriverWait(driver, 60) driver.get('https://wego.here.com/') wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input.input_search"))).send_keys("Seattle") wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='dropdown_list']/div[1]"))).click()
Это позволит выбрать первый вариант после отправки строки во входной тег.
Импорт:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC