Получение пустого раскрывающегося меню навигации при попытке доступа к веб-сайту с помощью Selenium (с использованием Python)

Я пытаюсь автоматизировать процесс, в котором я могу посетить веб-сайт, навести курсор на панель навигации меню и щелкнуть параметры в раскрывающемся списке, чтобы посетить эту страницу.

Для этого я работаю с Selenium (используя Python) и использую https://www.shoppersstop.com/ для тестирования своего кода.

Когда я запускаю приведенный ниже код, веб-сайт открывается правильно, но я получаю пустой раскрывающийся список, поэтому, когда я пытаюсь щелкнуть любую опцию из раскрывающегося списка, я получаю сообщение об ошибке «Элементы не найдены».Вот скриншот того, что я вижу.

Я попробовал использовать тот же код для просмотра раскрывающегося списка на веб-сайте Amazon.In, и он работал правильно. Я также пробовал добавить time.sleep() между действиями, но это все равно не работает.

Сообщение об ошибке ниже: Сообщение: такого элемента нет: невозможно найти элемент: {"method":"xpath","selector":"//a[text()='All Indian Wear']"} (Информация о сеансе: chrome=123.0.6312.107); Документацию по этой ошибке можно найти по адресу: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no- such-element-Exception

Ниже мой код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import pandas as pd
import requests
import time
import re

# Set Chrome options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36")

# Initialize driver with Chrome options
driver = webdriver.Chrome(options=chrome_options)

driver.get("https://www.shoppersstop.com/")     # Open the website
driver.maximize_window()        #Maximize window

try:
    WebDriverWait(driver, 20).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
    #time.sleep(10)
    actions = ActionChains(driver)
    women_category = driver.find_element(By.XPATH, "//html/body/main/header/nav/div[1]/div/ul[2]/li[4]/a")
    actions.move_to_element(women_category)          # Hover over the Women's category to reveal the dropdown
    actions.perform()
    #time.sleep(30)
    indian_wear = driver.find_element(By.XPATH, "//a[text()='All Indian Wear']")
    actions.move_to_element(indian_wear).perform().click()
    #time.sleep(20)
except Exception as e:
    print(e)

driver.quit()       # Close the browser

Уже упоминалось выше.

Я получаю то же самое. Я не знаю, что это такое. Я так понимаю это какая-то защита от ботов?

JeffC 15.04.2024 19:09

Я согласен. Однако приведенное ниже решение с использованием SeleniumBase работает для меня!

Annie 16.04.2024 19:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычный Selenium блокируется на этом сайте для определенных разделов, но https://github.com/seleniumbase/SeleniumBase успешно проходит:

pip install seleniumbase, а затем с помощью python выполните следующее:

from seleniumbase import SB

with SB(uc=True, test=True) as sb:
    sb.driver.get("https://www.shoppersstop.com/")
    sb.hover_and_click('a[title = "WOMEN"]', "//a[text()='All Indian Wear']")
    
    breakpoint()

Введите c и нажмите Enter в консоли, чтобы продолжить с Python breakpoint().

Обратите внимание, что SeleniumBase автоматически определяет селекторы, поэтому вы можете использовать CSS или XPath для встроенных методов SeleniumBase.

Спасибо @Michael за то, что познакомил меня с SeleniumBase. Приведенный выше код изначально не работал, но ввел sb.sleep(3) до того, как оператор hover_and_click исправил это. Вероятно, из-за ограничений по времени загрузки страницы сначала он не работал. Спасибо большое еще раз!

Annie 16.04.2024 19:21

Другие вопросы по теме