Estou tentando acessar dados de "https://www.nseindia.com/report-detail/eq_security", mas quando insiro um símbolo, por exemplo, "INFY", preciso selecionar a ação no menu suspenso. Tentei usar o Selenium para clicar na primeira opção do menu suspenso, pois os símbolos são únicos, então a primeira opção deveria ser minha ação. Mas não consigo visualizar o menu suspenso. Alguém pode sugerir como clico na primeira opção do menu suspenso e, em seguida, obtenho os dados da tabela abaixo?
Até agora construí abaixo:
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
# Start undetected Chrome
driver = uc.Chrome()
driver.get("https://www.nseindia.com/report-detail/eq_security")
# Wait for the page to load
time.sleep(5)
# Step 1: Find the symbol input field
symbol_input = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="hsa-symbol"]'))
)
# Step 2: Click on it and type 'INFY' with delays
symbol_input.click()
time.sleep(1)
# Human-like typing
for char in "INFY":
symbol_input.send_keys(char)
time.sleep(random.uniform(0.3, 0.6))
# Step 3: Wait for the dropdown to be visible
try:
# Wait for the dropdown to be visible
dropdown = WebDriverWait(driver, 15).until(
EC.visibility_of_element_located((By.XPATH, '//ul[contains(@class, "ui-autocomplete")]'))
)
# Print the HTML of the dropdown to verify it's visible
dropdown_html = driver.page_source
if 'ui-autocomplete' in dropdown_html:
print("✅ Dropdown is visible.")
else:
print("❌ Dropdown not visible.")
# Locate all the dropdown items
dropdown_items = driver.find_elements(By.XPATH, '//ul[contains(@class, "ui-autocomplete")]/li')
if dropdown_items:
print("✅ Dropdown items found.")
for item in dropdown_items:
print(item.text) # Print all options
# Ensure the first item is in view
driver.execute_script("arguments[0].scrollIntoView();", dropdown_items[0])
# Click the first item using JavaScript
driver.execute_script("arguments[0].click();", dropdown_items[0])
print("✅ Clicked on the first dropdown item.")
else:
print("❌ No dropdown items found.")
except Exception as e:
print(f"❌ Error: {str(e)}")
Não há necessidade de simular a entrada de dados "de tipo humano". Você também não precisa do driver Chrome não detectado para isso. E você definitivamente não precisa nem quer as chamadas de suspensão.
Experimente isto:
Saída:
Você complicou o código. Veja o código simples e funcional abaixo:
Observação: a expressão XPath abaixo selecionará o primeiro item suspenso:
Abaixo selecionaremos o segundo item:
E assim por diante.