Python Selenium Не может найти кнопку в HTML

#python #selenium

Вопрос:

Я довольно новичок в селене. Я провожу некоторые тесты с селеном для Python. В качестве упражнения мне нужно получить доступ к веб-службе доставки и получить краткий список магазинов. Однако я не могу перейти на первую страницу. Это URL-адрес:

https://web.cornershopapp.com/stores-search/tech

На этом сайте мне нужно «нажать» на кнопку «Отменить», затем ввести почтовый индекс (например, 52989), затем нажать «Продолжить», и все… Затем я могу очистить список магазинов, который появится.

Однако с самого начала я получаю всевозможные сообщения об ошибках в консоли

Я делаю что-то вроде этого:

     options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    driver = webdriver.Chrome('chromedriver', options=options)
    driver.get(url)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    cancel_button = soup.find("span", text="Cancelar")
    print(cancel_button)
 

Но я не могу найти кнопку «Отмена», не говоря уже о том, чтобы нажать ее или ввести почтовый индекс на следующем шаге. Полученный html-код, похоже, не соответствует html-коду, который я получаю при проверке вручную в Chrome.

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

Ошибки, которые я получаю, следующие:

 [23968:11884:0603/100416.187:ERROR:device_event_log_impl.cc(214)] [10:04:16.188] USB: usb_device_handle_win.cc:1054 Failed to read descriptor from node connection: Uno de los dispositivos conectados al sistema no funciona. (0x1F)
[23968:11884:0603/100416.189:ERROR:device_event_log_impl.cc(214)] [10:04:16.189] USB: usb_device_handle_win.cc:1054 Failed to read descriptor from node connection: Uno de los dispositivos conectados al sistema no funciona. (0x1F)
[23968:11884:0603/100416.189:ERROR:device_event_log_impl.cc(214)] [10:04:16.189] USB: usb_device_handle_win.cc:1054 Failed to read descriptor from node connection: Uno de los dispositivos conectados al sistema no funciona. (0x1F)
 

Комментарии:

1. Когда я нажал на Cancel кнопку, я увидел выпадающее меню, я не могу ввести там почтовый индекс 52989.

2. @cruisepandey Это странно. Я только что попробовал еще раз использовать окно инкогнито. Сразу после нажатия кнопки «Отменить» я получаю еще один экран с запросом почтового индекса и кнопкой «Продолжить». Никаких выпадающих списков :S

Ответ №1:

Я попробовал приведенный ниже код :

 executable_path = r"C:\Users\etc\Desktop\Selenium Python\chromedriver.exe"
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--enable-javascript")
driver = webdriver.Chrome(executable_path, options=options)
wait = WebDriverWait(driver, 10)
driver.get("https://web.cornershopapp.com/stores-search/tech")
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Cancel']/.."))).click()
select = Select(driver.find_element_by_tag_name('select'))
select.select_by_visible_text('México')
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[placeholder='Zip code']"))).send_keys('52989')
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Continue']/.."))).click()
 

Комментарии:

1. Уоу! Это прекрасно! Спасибо!

Ответ №2:

Я не знаком с модулем BeautifulSoup, поэтому я бы просто использовал driver.find_element_by_css_selector(thecssSelectorOfTheCancelButton).click() это, нажму эту кнопку, аналогично, если вы хотите найти текст этого элемента, вы можете изменить его на driver.find_element_by_css_selector(thecssSelectorOfTheCancelButton).text Если вы просто хотите распечатать элемент по какой-то причине, вы можете просто сделать print(driver.find_element_by_css_selector(thecssSelectorOfTheCancelButton)) . Я всегда рекомендую использовать селекторы css, поскольку они являются наиболее универсальными селекторами.