在 Python、Selenium 中跨多个 Firefox 页面拉取 Excel 数据
Posted
技术标签:
【中文标题】在 Python、Selenium 中跨多个 Firefox 页面拉取 Excel 数据【英文标题】:Pulling Excel data across multiple firefox pages in Python, Selenium 【发布时间】:2017-10-09 02:07:54 【问题描述】:目标:从 Excel 中获取名字和姓氏列表,并将它们放入在线注册表单中,使用多个 Firefox 页面,每页只有一个名字和一个姓氏。
任务:
-
打开 Firefox 页面
用 Excel 填写“名字”文本框,单元格 'A2'="Bob"
用 Excel 填写“姓氏”文本框,单元格 'B2'="Apple"
点击“提交”。 -- 注册结束 1 --
打开一个新的 Firefox 页面
用 Excel 填写“名字”文本框,单元格 'A3'="Linda"
用 Excel 填写“姓氏”文本框,单元格“B3”=“橙色”
点击“提交”。
for x in range(2):
from selenium import webdriver
browser=webdriver.Firefox()
browser.get('The Website')
import openpyxl
wb=openpyxl.load_workbook('Names.xlsx')
sheet=wb.get_sheet_by_name('Full Names')
tuple(sheet['A2':'B3'])
#I'm guessing about this next part:
for rowOfCellObjects in sheet['A2':'B3']:
for cellObj in rowOfCellObjects:
browser.find_element_by_id('first_name').send_keys(????)
browser.find_element_by_id('last_name').send_keys(????)
使用 Python 3.6.2。 Excel 2016。Windows 10 x64。硒。 请在答案中将其简化,我对编码很陌生:)。谢谢!!
【问题讨论】:
【参考方案1】:这是我常用的格式:
import pandas as pd
from selenium import webdriver
driver = webdriver.Firefox()
headers = ['first_name', 'last_name']
data = pd.read_csv('Names.csv', names=headers) #Youll want to change the .xlsx to .csv
depth = len(data['first_names']) #this finds how deep the columns are
url = "www.website.com"
driver.get(url) #opens browser
for i in range (0,depth):
driver.find_element_by_xpath('first_name').send_keys(data['first_name'][i])
driver.find_element_by_xpath('last_name').send_keys(data['last_name'][i])
driver.find_element_by_xpath('submit').click()
还要注意在find_element_by_xpath中,格式是:
driver.find_element_by_xpath('//input[@name = "first_name"]')
或类似的。您需要 ctl+i 或右键单击-->检查以找到 xpath。 'input' 是主标签名称,'name' 将是 'input' 中嵌入了“first_name”字符串的任何元素。
【讨论】:
嗯,你在做一个 print() 声明吗?如果您使用 depth = len(data["bill_fname"]),然后使用 print(depth) 它应该只返回一个整数。解决此问题的一种方法是,如果列的深度是静态的,则只需手动设置 depth = some_number。此外,对于 headers = [],请务必使您放置在该列表中的标题与电子表格中的标题完全相同。从工作表中获得这些标题后,您需要将 len(data[" "]) 更改为这些标题 谢谢!这让它更接近。 'first_name' 只是元素 id 的占位符。元素 ID 是 ('bill_fname') #first name 字段和 ('bill_lname') #last name 字段。我在你有'first_name'的地方替换了第一个ID,在你有'last_name'的地方替换了第二个ID。 (并按照建议使用xpaths)它返回TypeError:'numpy.float64'类型的对象没有len(),并将我的整个“1”行从csv文件打印到名字字段中。在深度行中尝试复数“bill_fnames”并将其更改为“bill_fname”以获取上述错误时,我遇到了 KeyError。 我还没有写打印报表,没有。 如果 len() 仍然存在问题,请暂时尝试手动设置 depth = some_num csv 表的 A1=First B1=Last。 len(data['First']) 有效,打印正确的数字! headers=['First', 'Last'] driver.find_element_by_xpath('//*[@id="bill_fname"]') 导致 KeyError: 'bill_fname',而 shell 发现没有问题: driver.find_element_by_xpath( '//*[@id="bill_fname"]')以上是关于在 Python、Selenium 中跨多个 Firefox 页面拉取 Excel 数据的主要内容,如果未能解决你的问题,请参考以下文章
如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?