草庐IT

Selenium入门笔记

西伯利亚的长颈鹿 2024-06-29 原文

介绍

目录

介绍

内核下载

建立游览器对象

网页元素定位

 frame切换

js键入

 实例代码


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

有关Selenium入门笔记的更多相关文章

  1. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  7. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  8. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  9. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  10. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

随机推荐