为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

www说 2022-01-11 20:20:59
我一直在尝试制作一个 Python 脚本来登录某个网站,浏览菜单,填写表格并将它生成的文件保存到文件夹中。我一直在使用 Selenium 试图使网站完全加载,以便我可以找到登录元素,但我没有成功,可能是因为网站在完全加载之前做了很多 JavaScript 内容,但我不能让它完全加载并向我展示我想要的数据。我尝试了 Robobrowser、Selenium、Requests 和 BeautifulSoup 来完成它。import requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverurl = "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)字段,但我什至找不到该元素。
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

似乎这里需要一点滚动,等待和切换,以防登录字段还没有准备好输入:) 下面应该可以工作,我们实际上滚动到元素,切换到 iframe,在我们与登录表单的其余部分交互之前。您可以将延迟从 5 秒调整为您喜欢的任何内容。


from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

from 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()


查看完整回答
反对 回复 2022-01-11
?
慕村9548890

TA贡献1884条经验 获得超4个赞

要将字符序列123发送到密码 (senha)字段,因为所需的元素在 a 内,<frame>因此您必须:


诱导WebDriverWait使所需的帧可用并切换到它。

诱导WebDriverWait使所需元素成为可点击的。

您可以使用以下解决方案:


代码块:


from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC


options = 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")

浏览器快照:

//img1.sycdn.imooc.com//61dd76550001851513670767.jpg

查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号