草庐IT

python之selenium调用xpath实现网页操作

孙犯困 2023-04-15 原文

目录

源码

#coding=utf-8
#program:供本司运维人员填写bbs日志使用
#author:sundz
#V1 20220623 创建代码 实现点击
#V2 20220626 从Excel中获取数据自动填充;实现从交易所网站获取当日实时成交量
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import xlrd
import datetime
s = Service("msedgedriver.exe")
driver = webdriver.Edge(service=s)
driver.get('http://192.168.28.101/WebLog/index.jsp?userName=sundz')   #打开网页
#URL = input('Enter Your BBS-URL : ')
#driver.get(URL)   #打开网页
driver.maximize_window()                    #最大化窗口
#进入填写当前日志frame
driver.switch_to.frame("leftFrame")
driver.find_element(by=By.XPATH, value="/html/body/a[1]").click()
sleep(1)
driver.switch_to.default_content() #切换回主frame 以进入列表frame进行填写
driver.switch_to.frame("mainFrame") #列表和进入列表的frame都是mainFrame

def commit():	#提交
	driver.find_element(by=By.XPATH, value="/html/body/form/p/input[1]").click()  #提交按钮
	#sleep(1)
	#处理网页弹框
	alert=driver.switch_to.alert
	#print(alert.text)
	alert.accept()
	alert.accept()
def review():	#复核
	driver.find_element(by=By.XPATH, value="/html/body/form/p/input[2]").click()  #复核按钮
	#sleep(1)
	#处理网页弹框
	alert=driver.switch_to.alert
	#print(alert.text)
	alert.accept()
	alert.accept()
	sleep(1)
def listname(listname):	#进入表格
	driver.find_element(by=By.XPATH, value=listname).click() #进入表格 也是mainframe
	commit()	#提交
	#复核
	driver.find_element(by=By.XPATH, value=listname).click()
	#sleep(1)
	review()	#复核
def xls_to_URL(a,b,c):	#excel数据处理进网页,a b是excel坐标,c是需要填充的xpath
	filename = (datetime.datetime.now().strftime("%Y%m%d") + '运行日报委托成交统计.xls')
	work_book = xlrd.open_workbook(filename)
	table = work_book.sheet_by_index(0)	#通过索引获取sheet
	work_book.sheet_loaded(0)	# 检查某个sheet是否导入完毕
	str_0 = table.cell_value(a,b)	# 返回单元格中的数据类型
	str_1 = str_0.split(":", 2)[1]	#单元格数据处理完成
	#填充网页数据,先置空再填充
	driver.find_element(by=By.XPATH, value=c).send_keys("")
	driver.find_element(by=By.XPATH, value=c).send_keys(str_1)

#listname("/html/body/table/tbody/tr[2]/td[2]/a")
#对第一个列表处理 因为填充数据
driver.find_element(by=By.XPATH, value="/html/body/table/tbody/tr[2]/td[2]/a").click() #进入表格 也是mainframe
xls_to_URL(1,2,"/html/body/form/table[2]/tbody/tr[21]/td[5]/textarea")
xls_to_URL(2,2,"/html/body/form/table[2]/tbody/tr[22]/td[5]/textarea")
xls_to_URL(3,2,"/html/body/form/table[2]/tbody/tr[23]/td[5]/textarea")
xls_to_URL(4,2,"/html/body/form/table[2]/tbody/tr[24]/td[5]/textarea")
xls_to_URL(5,2,"/html/body/form/table[2]/tbody/tr[25]/td[5]/textarea")
xls_to_URL(6,2,"/html/body/form/table[2]/tbody/tr[26]/td[5]/textarea")
xls_to_URL(7,2,"/html/body/form/table[2]/tbody/tr[27]/td[5]/textarea")
xls_to_URL(8,2,"/html/body/form/table[2]/tbody/tr[30]/td[5]/textarea")
xls_to_URL(9,2,"/html/body/form/table[2]/tbody/tr[31]/td[5]/textarea")
xls_to_URL(10,2,"/html/body/form/table[2]/tbody/tr[32]/td[5]/textarea")
xls_to_URL(11,2,"/html/body/form/table[2]/tbody/tr[33]/td[5]/textarea")
xls_to_URL(12,2,"/html/body/form/table[2]/tbody/tr[34]/td[5]/textarea")
xls_to_URL(13,2,"/html/body/form/table[2]/tbody/tr[35]/td[5]/textarea")
xls_to_URL(14,2,"/html/body/form/table[2]/tbody/tr[36]/td[5]/textarea")
commit()	#提交
driver.find_element(by=By.XPATH, value="/html/body/table/tbody/tr[2]/td[2]/a").click() #再次进入复核
review()	#复核

listname("/html/body/table/tbody/tr[3]/td[2]/a")
listname("/html/body/table/tbody/tr[4]/td[2]/a")
listname("/html/body/table/tbody/tr[5]/td[2]/a")
listname("/html/body/table/tbody/tr[6]/td[2]/a")
listname("/html/body/table/tbody/tr[7]/td[2]/a")
listname("/html/body/table/tbody/tr[8]/td[2]/a")
listname("/html/body/table/tbody/tr[9]/td[2]/a")
listname("/html/body/table/tbody/tr[10]/td[2]/a")
listname("/html/body/table/tbody/tr[11]/td[2]/a")
listname("/html/body/table/tbody/tr[12]/td[2]/a")
listname("/html/body/table/tbody/tr[13]/td[2]/a")
listname("/html/body/table/tbody/tr[14]/td[2]/a")
listname("/html/body/table/tbody/tr[15]/td[2]/a")
listname("/html/body/table/tbody/tr[16]/td[2]/a")
listname("/html/body/table/tbody/tr[17]/td[2]/a")
listname("/html/body/table/tbody/tr[18]/td[2]/a")
listname("/html/body/table/tbody/tr[19]/td[2]/a")
listname("/html/body/table/tbody/tr[20]/td[2]/a")
listname("/html/body/table/tbody/tr[21]/td[2]/a")
listname("/html/body/table/tbody/tr[28]/td[2]/a")
listname("/html/body/table/tbody/tr[30]/td[2]/a")
listname("/html/body/table/tbody/tr[31]/td[2]/a")
listname("/html/body/table/tbody/tr[32]/td[2]/a")

#以下内容填充沪深成交额
#上海成交额
driver.get('http://q.10jqka.com.cn/zs/detail/code/1A0001/')   #打开网页
a = driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[3]/div[2]/div/div/div[1]/div[2]/dl[7]/dd").text 
#深圳成交额
driver.get('http://www.szse.cn/')   #打开网页
b = driver.find_element(by=By.XPATH, value="/html/body/div[11]/div/div/div[1]/div[3]/div[1]/div[1]/div/ul/li[1]/span[4]").text 
c = "沪:" + a + "  深:" + b
driver.get('http://192.168.28.101/WebLog/index.jsp?userName=sundz')   #打开网页
#进入填写当前日志frame
driver.switch_to.frame("leftFrame")
driver.find_element(by=By.XPATH, value="/html/body/a[1]").click()
sleep(1)
driver.switch_to.default_content() #切换回主frame 以进入列表frame进行填写
driver.switch_to.frame("mainFrame") #列表和进入列表的frame都是mainFrame
driver.find_element(by=By.XPATH, value="/html/body/table/tbody/tr[2]/td[2]/a").click() #进入表格 也是mainframe
#print (c)
driver.find_element(by=By.XPATH, value="/html/body/form/table[2]/tbody/tr[20]/td[5]/textarea").send_keys(c)
commit()	#提交
driver.find_element(by=By.XPATH, value="/html/body/table/tbody/tr[2]/td[2]/a").click() #再次进入复核
review()	#复核

过程中遇到的主要问题

1.调用xpath之前 需要先调用frame 以定位!!!
2.定位到新的frame 需要先退出之前的frame

主要涉及的技术处理

1.xpath调用
2.浏览器驱动调用
3.网页弹框处理
4.xlrd库

存在疑问:

1.对已经填充xpath数据的网页 怎么把数据置空
2.检测浏览器是否打开 打开则继续使用

有关python之selenium调用xpath实现网页操作的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

随机推荐