如何使用 selenium 在网页上执行所有 javascript 内容以在完全加载的网页上查找

我一直在尝试制作一个 Python 脚本来登录某个网站,浏览菜单,填写表格并将它生成的文件保存到文件夹中。


我一直在使用 Selenium 试图使网站完全加载,以便我可以找到登录元素,但我没有成功,可能是因为网站在完全加载之前做了很多 JavaScript 内容,但我不能让它完全加载并向我展示我想要的数据。


我尝试了 Robobrowser、Selenium、Requests 和 BeautifulSoup 来完成它。


import requests

from bs4 import BeautifulSoup

from selenium import webdriver


url = "https://directa.natal.rn.gov.br/"


driver = webdriver.Chrome(executable_path="C:\\webdrivers\\chromedriver.exe")

driver.get(url)


html = driver.execute_script("return document.documentElement.outerHTML")

sel_soup = BeautifulSoup(html, 'html.parser')


senha = driver.find_element_by_xpath('//*[@id="senha"]')

senha.send_keys("123")

我希望用“123”填写密码(senha)字段,但我什至找不到该元素。


www说
浏览 274回答 2
2回答

眼眸繁星

似乎这里需要一点滚动,等待和切换,以防登录字段还没有准备好输入:) 下面应该可以工作,我们实际上滚动到元素,切换到 iframe,在我们与登录表单的其余部分交互之前。您可以将延迟从 5 秒调整为您喜欢的任何内容。from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutException""" Variables """url = "https://directa.natal.rn.gov.br/"delay = 5 # seconds""" Initiate driver """driver = webdriver.Chrome(executable_path="C:\\webdrivers\\chromedriver.exe")""" Go to url """driver.get(url)""" Iframe switch """WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='mainsystem'][src^='main']")))""" Attempt to get all our elements """try:    """ Username """    usuario = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'usuario')))    """ Password """    senha = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'senha')))    print("All elements located!")except TimeoutException:    print("Loading took too much time!")    exit(0)"""Scroll to our element """driver.execute_script("arguments[0].scrollIntoView();", usuario)""" Input data into our fields """usuario.send_keys("username")senha.send_keys("password")""" Locate our login element """login = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'acessar')))""" Click Login """login.click()

慕村9548890

要将字符序列123发送到密码 (senha)字段,因为所需的元素在 a 内,<frame>因此您必须:诱导WebDriverWait使所需的帧可用并切换到它。诱导WebDriverWait使所需元素成为可点击的。您可以使用以下解决方案:代码块:from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECoptions = webdriver.ChromeOptions()options.add_argument("start-maximized")options.add_argument('disable-infobars')options.add_argument("--disable-extensions")driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')driver.get("https://directa.natal.rn.gov.br/")WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='mainsystem'][src^='main']")))WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input[name='usuario']"))).send_keys("Tads")driver.find_element_by_css_selector("input.input[name='senha']").send_keys("123")浏览器快照:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python