0


Selenium入门笔记

介绍

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("网页抓取失败!")

本文转载自: https://blog.csdn.net/m0_59160272/article/details/125723218
版权归原作者 西伯利亚的长颈鹿 所有, 如有侵权,请联系我们删除。

“Selenium入门笔记”的评论:

还没有评论