在 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 工作?

如何在 youtube api 中跨多个频道搜索内容?

在 Grails 中跨多个插件共享身份验证

如何在 node.js 中跨多个文件拆分类定义?

如何在 wxPython 中跨多个监视器创建框架?

如何在 PHPUnit 中跨多个测试模拟测试 Web 服务?