介绍
Selenium是一个用于Web应用程序测试的工具。直接运行在浏览器中,就像真正的用户在操作一样。
优点:像用户直接访问网站一般,用户可做的操作Selenium基本可以完成;需要前端开发的知识较少,对于前端代码不熟悉的人也容易上手。
缺点:需要等待网页加载刷新完毕才可以完成步骤,时间相对较慢。
内核下载
Selenium需要搭配游览器的内核才可以使用,以公司的电脑为例,我们使用得为Edge游览器,所以需要下载对应的Edge内核。 可在<设置><关于>中找寻到Edge游览器的版本,如图版本为103.0.1264.37,及我们需要下载对应版本的内核。
到官网(https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)下载对应的内核 Full Directory是历史来所有版本的内核 下载后的内核需要与python在同一个文件夹内,且名称需改为MicrosoftWebDriver.exe
建立游览器对象
driver= webdriver.Edge()#游览器对象的实例 (根据游览器内核选择对应的对象实例化)
driver.maximize_window()#窗体最大化 driver.minimize_window()#窗体最小化
driver.get('http://192.168.0.151/Default.aspx') #获取网页地址(以公司QMS系统为例)
driver.Quite()#实例化对象的关闭
进入网页后我们需要找到网页的各个元素,以便于我们进行自动化操作的编写。
所以首先我们需要定位到使用者账号、使用者密码的TextBox中,对TextBox进行文字填入的操作。
需要知道元素的属性才可以进行定位,例如(classname、id、path) 此时需要进入网页的前端代码,查看html代码
网页元素定位
选择需定位元素,右键点击检查,或按F12按钮,进入开发者模式
可以根据习惯选择工具停靠位置
选择元素代码时间,元素会出现相应的颜色变化作为选择提示
find_element_by_class_name:根据class定位
find_element_by_css_selector: 根据css定位
find_element_by_id:根据id定位
find_element_by_link_text:根据链接为本进行定位(需要完全相同)
find_element_by_name:根据节点名定位
find_element_by_partial_link_text:根据链接为本来定位(只要包含整个文本即可)
find_element_by_path:使用Xpath进行定位 学会使用
find_element_by_path对元素的定位非常有帮助,在元素没有class、id、name等属性时,我们同样可以很好的定位到元素
学会使用find_element_by_path对元素的定位非常有帮助,在元素没有class、id、name等属性时,我们同样可以很好的定位到元素 可以直接选择元素代码,右键进行Xpath的复制
driver= webdriver.Edge()#游览器对象的实例
#driver.maximize_window()#窗体最大化
driver.get('http://192.168.0.151/Default.aspx')
driver.find_element_by_name("tbUserID").send_keys(User_ID)
driver.find_element_by_name("tbPassword").send_keys(User_PassWord)
driver.find_element_by_name("btnLoginIn").click()
time.sleep(1)
定位到元素后可通过,对元素的事件进行操作,例如,send_keys()(键盘输入)、click()为点击操作
tree元素下存在多个ui或者li元素如果单个去定位,有时会显得非常的繁琐和复杂,可以使用先再到父元素tree在通过寻找父元素底下的子元素进行操作
网页结构会出现frame嵌套的情况,一个网页嵌套着另一个网页,如果需要找到嵌套的网页元素(及frame下的元素),必须进入frame之中才可以找到,否则是找不到的。 主要原因是前端语言允许父frame与子frame的元素属性相同 复制xpath路径也仅是<html>标签下的路径,所以复制的路径实际上是相对<html>的路径
frame切换
driver.switch_to.frame(Framepath)#进入frame
driver.switch_to.parent_frame(Framepath)#返回父frame
driver.switch_to.default_content()#退出frame,退到最顶层frame
部分Select元素没有输入按键的js代码,定位并用send_keys()输入按键并无法取得我们想要的效果,这种情况可以使用Select的实例化,创建一个实例进行操作。
MoldPath=driver.find_element_by_xpath('//*[@id="ddlMold"]')
MoldSelect=Select(MoldPath)
MoldSelect.select_by_value(MoldItems)
js键入
对于日历这类的元素,单纯使用send_keys()也是无法很好的满足我们的需求,此时又不是select类的对象。 可以发现此元素,存在input的属性,且value是可更改的属性。 可以通过键入js代码的方式去更改value的值,来完成目的。 js= "arguments[0].setAttribute(arguments[1],arguments[2])" driver.execute_script(js,InjectionStatrtimePath,"value",StatrTime) js为前端语言的格式,arguments[0]为元素对象,setAttribute为设置属性方法,arguments[1]为属性名, arguments[2]为属性值。 对应着InjectionStatrtimePath,"value",StatrTime
实例代码
from selenium import webdriver
from selenium.webdriver.support.select import Select
import numpy as np
import pandas as pd
import time
import sys
#8B69AA-0030A
#000000-0030A
#6135AZ-01500
#8982AA-0030A
Model_name="8B91BA-0030B"
#Model_name="8B69AA-0030A"
User_ID = ""
User_PassWord = "abc.2022"
StatrTime="2022-07-07 00:00:00"
EndTime="2022-07-08 08:00:00"
if (User_ID == "")&(User_PassWord == ""):
print("用户名或密码为空,请修改后重试!")
try:
driver= webdriver.Edge()#游览器对象的实例
#driver.maximize_window()#窗体最大化
driver.get('http://192.168.0.151/Default.aspx')
driver.find_element_by_name("tbUserID").send_keys(User_ID)
driver.find_element_by_name("tbPassword").send_keys(User_PassWord)
driver.find_element_by_name("btnLoginIn").click()
time.sleep(1)
MainMenu=driver.find_element_by_xpath('//*[@id="tree1"]')
MainMenuList = MainMenu.find_elements_by_xpath('li')
MainMenuList[0].click()
time.sleep(1)
QBMenu=MainMenuList[0].find_element_by_xpath('ul')
QBMenuList = QBMenu.find_elements_by_xpath('li')
QBMenuList[2].click()
Framepath = driver.find_element_by_xpath('//*[@id="framecenter"]/div[2]/div[2]/iframe')
driver.switch_to.frame(Framepath)
ProductPath=driver.find_element_by_xpath('//*[@id="ddlProduct"]')
InjectionStatrtimePath=driver.find_element_by_xpath('//*[@id="txtInjectionStatrtime"]')
InjectionEndTimePath=driver.find_element_by_xpath('//*[@id="txtInjectionEndTime"]')
js= "arguments[0].setAttribute(arguments[1],arguments[2])"
driver.execute_script(js,InjectionStatrtimePath,"value",StatrTime)
driver.execute_script(js,InjectionEndTimePath,"value",EndTime)
#InjectionStatrtimePath.send_keys(StatrTime)
#InjectionEndTime.send_keys(EndTime)
ProductName=ProductPath.text
ProductNameList=list(ProductName.replace(' ','').split('\n'))
ProductSelect=Select(ProductPath)
if (Model_name!="") & (Model_name in ProductNameList):
SelectIndex=ProductNameList.index(Model_name)
ProductSelect.select_by_index(SelectIndex)
time.sleep(1)
LensNoPath=driver.find_element_by_xpath('//*[@id="ddlLensNo"]')
LensNoSelect=Select(LensNoPath)
LensNoName=LensNoPath.text
LensNoNameList=list(LensNoName.replace(' ','').split('\n'))
Table_list=[]
Title_list=[]
TitleFind=True
for LensNoItems in LensNoNameList:
LensNoPath=driver.find_element_by_xpath('//*[@id="ddlLensNo"]')
LensNoSelect=Select(LensNoPath)
LensNoSelect.select_by_value(LensNoItems)
time.sleep(1)
MoldPath=driver.find_element_by_xpath('//*[@id="ddlMold"]')
MoldSelect=Select(MoldPath)
MoldName=MoldPath.text
MoldNameList=list(MoldName.replace(' ','').split('\n'))
for MoldItems in MoldNameList:
MoldPath=driver.find_element_by_xpath('//*[@id="ddlMold"]')
MoldSelect=Select(MoldPath)
MoldSelect.select_by_value(MoldItems)
#time.sleep(1)
QueryBottonPath=driver.find_element_by_xpath('//*[@id="btnQuery"]')
QueryBottonPath.click()
time.sleep(1)
DataCountPathFind=False
try:
DataCountPath=driver.find_element_by_xpath('//*[@id="ucPaging_ddlPageSize"]')
DataCountPathFind=True
except:
DataCountPathFind=False
if DataCountPathFind:
DataCountSelect=Select(DataCountPath)
DataCountSelect.select_by_value("100")
time.sleep(1)
TablePath=driver.find_element_by_xpath('//*[@id="gvUa3pSummary"]/tbody')
Table_tr_list=TablePath.find_elements_by_xpath('tr')
for tr in Table_tr_list:
Table_td_list=tr.find_elements_by_xpath('td')
Row_list=[]
if TitleFind:
Table_th_list=tr.find_elements_by_xpath('th')
for th in Table_th_list:
if (th.text!=' ')&(len(th.text)!=0):
Title_list.append(th.text)
TitleFind=False
for td in Table_td_list:
if (td.text!=' ')&(len(td.text)!=0):
Row_list.append(td.text)
if (len(Row_list)!=0):
Table_list.append(Row_list)
df=pd.DataFrame(Table_list,columns=Title_list)
BarcodeColumn=list(df['条码 Barcode'])
CavNoColumn=list(df['穴位 Cav No'])
Data=dict(map(lambda x,y:[x,y],BarcodeColumn,CavNoColumn))
Barcode=[]
for BarcodeItems,CavNoItems in Data.items():
if len(CavNoItems.split("、"))>=8:
Barcode.append(BarcodeItems)
driver.switch_to.default_content()
QB02=driver.find_element_by_xpath('//*[@id="tree1"]/li[1]/ul/li[2]')
QB02.click()
Framepath = driver.find_element_by_xpath('//*[@id="framecenter"]/div[2]/div[3]/iframe')
driver.switch_to.frame(Framepath)
BarcodeSearch= driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_ShowSecond"]')
BarcodeSearch.click()
for BarcodeText in Barcode:
print(BarcodeText)
BarcodeTextBox=driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_Barcode"]')
driver.execute_script(js,BarcodeTextBox,"value",BarcodeText)
Download=driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_btnCompressed"]')
Download.click()
print("下载完成!")
else:
sys.exit
except OSError:
print("网页抓取失败!")
版权归原作者 西伯利亚的长颈鹿 所有, 如有侵权,请联系我们删除。