使用 selenium 或 requests 填写表格

Posted

技术标签:

【中文标题】使用 selenium 或 requests 填写表格【英文标题】:Fill forms using selenium or requests 【发布时间】:2018-09-25 15:41:40 【问题描述】:

我正在尝试输入 this site 来检索我的银行帐户,首先我尝试使用 selenium,但只填写了用户名(可能是因为它有 2 个表单):

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.santandertotta.pt/pt_PT/Particulares.html")
user = driver.find_element_by_name("usr")
user.send_keys("user")
pas = driver.find_element_by_name("claveConsultiva")
pas.send_keys("password")
login = driver.find_element_by_id("login_button").click()

然后,我进入了 rambo 模式 :) 试图弄清楚为什么我不能填充密码空间,以及使用请求的表单的隐藏值是什么,这是代码:

url = "https://www.particulares.santandertotta.pt/pagina/indice/0,,276_1_2,00.html"     
user_agent = "user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/..."
session = requests.session()
r = session.get(url)
soup = BeautifulSoup(r.text, "html.parser")    
data = t['name']:t.get('value') for t in soup.find_all('input', attrs='type': 'hidden')
print(data)    

但刚刚收到一个空字典。通过登录和抓取进入网站的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您无法访问密码字段,因为它不在主页上。要处理密码字段,您必须单击登录按钮才能进入登录页面。您还需要切换到包含身份验证表单的 iframe

from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://www.santandertotta.pt/pt_PT/Particulares.html")
driver.find_element_by_xpath("//input[@title='Login de Particulares']").click()
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("ws"))
user = driver.find_element_by_name("identificacionUsuario")
user.send_keys("user")
pas = driver.find_element_by_name("claveConsultiva")
pas.send_keys("password")
pas.submit()

【讨论】:

【参考方案2】:

一旦您访问网址https://www.santandertotta.pt/pt_PT/Particulares.html,首先您必须点击文本为 Login 的元素,然后只需点击 NomePassword > 字段出现,但要访问这些字段,您必须切换到带有 id 的框架,因为 ws 会导致 WebDriverWait。接下来要定位 Nome 的元素,您必须再次诱导 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

driver=webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
driver.get("https://www.santandertotta.pt/pt_PT/Particulares.html")
driver.find_element_by_xpath("//input[@class='ttAH_button03']").click()
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "ws")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='inputlong' and @id='identificacionUsuario']"))).send_keys("your_name")
driver.find_element_by_xpath("//input[@id='claveConsultiva' and @name='claveConsultiva']").send_keys("your_password")
driver.find_element_by_link_text("Entrar no NetBanco Particulares").click()

在这里你可以找到Ways to deal with #document under iframe的相关讨论

【讨论】:

嘿,伙计,让我的答案有点复杂有什么意义? :) 非常感谢你们两个,这很有效......如果我想对请求做同样的事情,我还有多远? @Sátiro 恐怕我暂时会避开请求的上下文。如有任何关于 Selenium 的问题,请随时问我。 嗨,我如何关闭this 站点中的 java 弹出窗口,我使用 wait(driver,2).until(EC.element_to_be_clickable((By.XPATH,"//*[@ id='eurobicnet-name']"))).send_keys("bah" , Keys.RETURN) 出现一个弹窗 @Sátiro 您能否针对您的新要求提出一个新问题。因此,志愿者将很乐意为您提供帮助。

以上是关于使用 selenium 或 requests 填写表格的主要内容,如果未能解决你的问题,请参考以下文章

使用Postman或requests结合chromedriver模拟Selenium操作浏览器

python Web抓取selenium模块的使用

requests+selenium==requestium模块介绍

在 python 中使用 selenium 填写用户名和密码

使用 Selenium 和 PhantomJS 单击按钮并填写表单

如何从用于使用 Selenium 填写表单的 chrome 自动填充框中选择值