zoukankan      html  css  js  c++  java
  • python+selenium

    环境

    py3.6 + selenium

    安装selenium:pip install selenium

    下载chromedriver

    下载地址:nmp.taobao.org/mirrors/chromedriver找到对应版本

    一. 将chromedriver放到chrome浏览器安装路径

    路径如下:

    C:\UsersYPAppDataLocalGoogleChromeApplicationchromedriver.exe
    

    注意上面的  C:\要添加转义    如果写成C:Users 会报错

     二、chromedriver.exe放在python安装目录下,例如:
    C:Python36 这个目录里面
    这时,我们引用的时候是这样的:

    driver = webdriver.Chrome()
    

    元素定位

    元素定位的一个例子

    from selenium import webdriver
    from selenium.webdriver.common.keys import  Keys
    import time,os
    
    try:
        #第一种方式:放在goole chrom 安装目录
        path = "C:\UsersYPAppDataLocalGoogleChromeApplicationchromedriver.exe"
        driver = webdriver.Chrome(path)
        #第二种方式:放在python的安装目录 D:PythonPython36-32,这样就不用加 chromedriver的路径了
        #driver = webdriver.Chrome()
        #浏览器最大化
        driver.maximize_window()
        #link = "https://www.baidu.com/"
        link ="http://192.168.1.1/main.html#index_status"
        driver.get(link)
        #设置等待时间,有时候页面加载过久,没加载完成,会提示元素不可交互
        driver.implicitly_wait(5)
        #定位
        #id = "kw"
        id = "loginlink"
        seach_element = driver.find_element_by_id(id).click()
        #driver.find_element_by_class_name(class)
        #value = "selenium"
        id1 = "txtUsr"
        id2 = "txtPwd"
        id3 = "btnLogin"
        user = "admin"
        password = "admin"
        seach_element1 = driver.find_element_by_id(id1)
        seach_element1.send_keys(user)
        seach_element2 = driver.find_element_by_id(id2)
        seach_element2.send_keys(password)
        seach_element3 = driver.find_element_by_id(id3)
        seach_element3.click()
        #x_path定位
        x_path = "//*[@id="col2"]/div/div[1]/div[2]/label"
        driver.find_element_by_xpath(x_path).click()
        #css定位
        css = "#apn_setting > a"
        driver.find_element_by_css_selector(css).click()
        #回车搜索
        #seach_element.send_keys(Keys.RETURN)
    finally:
        time.sleep(3)
        driver.quit()
    View Code

    元素定位的方法

    #id
    driver.find_element_by_id(id)
    
    #class
    driver.find_element_by_class_name(class)
    
    #文字链接
    driver.find_element_by_link_text("手机")
    
    #局部文字链接
    driver.find_element_by_partial_link_text("手机手")
    
    #x_path
    driver.find_element_by_xpath(x_path)
    
    #css选择器
    driver.find_element_by_css_selector(css)

    更多定位方式可以点击send_keys()查看,文件名为webelement.py

    简单的几个处理方法

        seach_element1 = driver.find_element_by_id(id)
        seach_element1.send_keys(user)
    send_keys(),向定位的位置发送指定文字
    send_keys(Keys.RETURN) 发送回车
    click()   点击

    点击RENTURN可以查看键盘事件
    键盘事件需要导入Keys
    from selenium.webdriver.common.keys import  Keys
    NULL = 'ue000'
        CANCEL = 'ue001'  # ^break
        HELP = 'ue002'
        BACKSPACE = 'ue003'
        BACK_SPACE = BACKSPACE
        TAB = 'ue004'
        CLEAR = 'ue005'
        RETURN = 'ue006'
        ENTER = 'ue007'
        SHIFT = 'ue008'
        LEFT_SHIFT = SHIFT
        CONTROL = 'ue009'
        LEFT_CONTROL = CONTROL
        ALT = 'ue00a'
        LEFT_ALT = ALT
        PAUSE = 'ue00b'
        ESCAPE = 'ue00c'
        SPACE = 'ue00d'
        PAGE_UP = 'ue00e'
        PAGE_DOWN = 'ue00f'
        END = 'ue010'
        HOME = 'ue011'
        LEFT = 'ue012'
        ARROW_LEFT = LEFT
        UP = 'ue013'
        ARROW_UP = UP
        RIGHT = 'ue014'
        ARROW_RIGHT = RIGHT
        DOWN = 'ue015'
        ARROW_DOWN = DOWN
        INSERT = 'ue016'
        DELETE = 'ue017'
        SEMICOLON = 'ue018'
        EQUALS = 'ue019'
    
        NUMPAD0 = 'ue01a'  # number pad keys
        NUMPAD1 = 'ue01b'
        NUMPAD2 = 'ue01c'
        NUMPAD3 = 'ue01d'
        NUMPAD4 = 'ue01e'
        NUMPAD5 = 'ue01f'
        NUMPAD6 = 'ue020'
        NUMPAD7 = 'ue021'
        NUMPAD8 = 'ue022'
        NUMPAD9 = 'ue023'
        MULTIPLY = 'ue024'
        ADD = 'ue025'
        SEPARATOR = 'ue026'
        SUBTRACT = 'ue027'
        DECIMAL = 'ue028'
        DIVIDE = 'ue029'
    
        F1 = 'ue031'  # function  keys
        F2 = 'ue032'
        F3 = 'ue033'
        F4 = 'ue034'
        F5 = 'ue035'
        F6 = 'ue036'
        F7 = 'ue037'
        F8 = 'ue038'
        F9 = 'ue039'
        F10 = 'ue03a'
        F11 = 'ue03b'
        F12 = 'ue03c'
    
        META = 'ue03d'
        COMMAND = 'ue03d'
    View Code
    
    
    from selenium import webdriver
    #引入ActionChains类
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get('https://www.thishop.com/')
    time.sleep(3)
    #定位到要悬停的元素
    stop =driver.find_element_by_class_name("icon-arrow-down")
    #对定位到的元素执行鼠标悬停操作
    ActionChains(driver).context_click(stop).perform()
    
    

    键盘事件,在现实操作中我们习惯性的按tab见切换到写一个输入或者元素,Key()类几乎提供所有按键的方法

    
    

    下面经常使用到的键盘操作:
    send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
    send_keys(Keys.SPACE) 空格键(Space)
    send_keys(Keys.TAB) 制表键(Tab)
    send_keys(Keys.ESCAPE) 回退键(Esc)
    send_keys(Keys.ENTER) 回车键(Enter)
    send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
    send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
    send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
    send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
    send_keys(Keys.F1) 键盘 F1
    ……
    send_keys(Keys.F12) 键盘 F12

    
    
    from selenium import webdriver #引入Keys模块
    from selenium.webdriver.common.keys import Keys
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    #输入框输入内容
    driver.find_element_by_id("kw").send_keys("seleniumm")
    #删除多输入的一个m
    driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
    #输入空格键+“教程”
    driver.find_element_by_id("kw").send_keys(Keys.SPACE)
    driver.find_element_by_id("kw").send_keys(u"教程")
    #ctrl+a 全选输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
    #ctrl+x 剪切输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
    #ctrl+v 粘贴内容到输入框
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
    #通过回车键盘来代替点击操作
    driver.find_element_by_id("su").send_keys(Keys.ENTER)
    driver.quit()


    鼠标事件
    from selenium import webdriver
    #鼠标悬停需要用到ActionChains
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    try:
        driver = webdriver.Chrome()
        driver.maximize_window()
        link = "http://192.168.1.1/main.html#index_status"
        driver.get(link)
        driver.implicitly_wait(5)
        #定位悬停的元素
        elem = driver.find_element_by_link_text("Login")
        #鼠标悬停事件,能看到页面上有下划线,即是悬停成功了
        ActionChains(driver).move_to_element(elem).perform()
        time.sleep(2)
        #键盘事件
    
    finally:
        time.sleep(2)
        driver.quit()
    View Code

    鼠标事件需要导入ActionChains

    from selenium.webdriver.common.action_chains import ActionChains

    更多鼠标事件可以点击move_to_element 查看

    在自动化测就是模拟人为的操作,上一篇讲的是定位页面元素来找到某个点,当我们找到该元素后可以进行相应的操作

    clear()    清除文本

    send_keys("输入内容")   想输入框输入内容

    click()  点击事件

    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').clear()   #清除输入框
    driver.find_element_by_id('kw').send_keys('selenium+python')   #输入selenium+python
    driver.find_element_by_id('su').click()   #点击搜索按钮

    通过上面的操作可以模拟鼠标的操作如click()不过现实中鼠标还有的操作,比如双击、右键、拖动、悬停等等,在WebDriver 中这些关于鼠标操作的方法由 ActionChains 类提供。

    ActionChains类提供的鼠标操作的常用方法:
     perform() 执行所有 ActionChains 中存储的行为

    context_click() 右击

    double_click() 双击

    drag_and_drop() 拖动

    move_to_element() 鼠标悬停

    关于等待时间

    selenium中的等待时间有3种:sleep(second);WebDricerWait(driver,timeout,poll_frequency,ignored_exceptions);implicicitly(second)

    1.sleep(second) :强制等待,封装在time中的sleep类中

    time.sleep(3)

    2.WebDricerWait(driver,timeout,poll_frequency,ignored_exceptions) 显式等待,当找到要校验的元素后就继续执行下面的程序,非强制等待

    driver:浏览器驱动

    timeout:最长超时,秒为单位

    poll_frequency:检测间隔(步长)时间,默认为0.5s

    ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException

    webDriverWait 一般与until()与until_not()方法配合使用

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    #WebDriverWait  显式等待
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com/")
    el = driver.find_element_by_xpath('//*[@id="kw"]')
    element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
    element.send_keys("selenium")
    driver.find_element_by_xpath('//*[@id="su"]').click()
    sleep(5)
    driver.quit()

    3.implicicitly(second)隐式等待,设置最长等待时长,如果在特定时间内未找到元素则抛出NoSuchElementException异常

        driver = webdriver.Chrome()
        driver.maximize_window()
        link = "http://192.168.1.1/main.html#index_status"
        driver.get(link)
        driver.implicitly_wait(5)

    上传文件的方法

    1.通过input方式上传文件

    seach_element = driver.find_element_by_id("fileField").send_keys(path)

    2.通过AutoIt
    有的不是通过input上传的,就需要特别处理了,这里我们用autoit 来上传文件

    AutoIt的主要功能?

    1)模拟键击动作(支持大多数的键盘布局) 
    2)模拟鼠标移动和点击动作。
    3)对窗口进行移动、调整大小和其它操作。
     4)直接与窗口的“控件“交互(设置/获取 文字、移动、关闭,等等) 
     5)配合剪贴板进行剪切/粘贴文本操作 
     6)对注册表进行操作

    下载地址:https://www.autoitscript.com/site/autoit/downloads/

    安装完成后可以在开始菜单看到如下显示:

    用Autoit定位Windows弹框

    1.在页面中定位并点击“选择文件”按钮,显示如下所示弹框,因为是页面外Windows弹框,需要使用AutoIt工具实现。(这里打开上传的地方,弹出window的选择框,这里之前查的资料都是打开自带的autoit工具弹窗,根本用不了)

    第二步:写脚本

    1)点击“开始”--- 找到“AutoIt V3”工具包 --- 点击“AutoItWindow Info(x64)”工具,版本按本机系统来选择,显示如下:

    2)鼠标选中“FinderTool”,拖动到“文件名”输入框中,即可定位该输入框。重复上述步骤定位“打开”按钮。如图显示:

     

    3)使用AutoIt工具包下的“SciTE Script Editor”写脚本,并保存为au3格式。

    编译完后,保存,直接按F5运行脚本,

    正确上传即表示成功

    注意:如果页面报错提示如下:需检查脚本中引号的使用是否正确。特别是第一行和第三行。

    还有路径不要加 \   而是正常的:D:utel.zip

    ControlFocus("打开","","Edit1")

    WinWait("[CLASS:#32770]","",10)

    ControlSetText("打开","", "Edit1", "")

    Sleep(2000)

    ControlClick("打开","","Button1")

     代码解释:

    第一行:

    ControlFocus ( "title", "窗口文本",controlID) 设置输入焦点到指定窗口的某个控件上;

    第二行:

    WinWait ( "title" , "窗口文本" , 超时时间 ) 暂停脚本的执行直至指定窗口存在(出现) 为止;

    第三行:

    ControlSetText ( "title", "窗口文本",controlID, "新文本" ) 修改指定控件的文本;

    第四行:Sleep 延迟执行

    第五行:ControlClick ( "title", "窗口文本",控件ID , 按钮 , 点击次数 ) 向指定控件发送鼠标点击命令;

    其中:“title”即AutoIt Window Info识别出的Title字段(上图标红部分), “controlID”即AutoItWindow Info识别出的Class和Instance的拼接,就是ClassnameNN的值。

    第三步:编译为可执行文件

    使用AutoIT工具包下的Complie Script to .exe工具把刚编写的脚本编译成可执行文件,操作如下:

    第四步:调用可执行文件

    在python脚本中添加

    2)在代码中写入:
    
    import os
    os.system(os.getcwd() + "\autoit\import.exe")  或者直接os.system("D:\upfile.exe")

     以上通过第三方软件导入脚本的方法比较麻烦

    更简单的方式是

    #上传配置,当网页代码是用input的,并且是type = text
            driver.find_element_by_xpath("//*[@id="fileField"]").send_keys(path_cfg)

    满足条件为:当网页代码是用input的,并且是type = text

    JS定位

    实例

    # !/usr/bin/env python
    # _*_coding:utf-8_*_
    
    from selenium import webdriver
    import time
    
    try:
        driver = webdriver.Chrome()
        driver.maximize_window()
        link = "https://www.12306.cn/index/"
        driver.get(link)
        time.sleep(3)
        driver.implicitly_wait(5)
        from_element = driver.find_element_by_id("fromStationText")
        from_element.click()
        time.sleep(2)
        from_element.send_keys("北京")
        #driver.find_elements_by_xpath("//*[test()='北京北']").click()//*[@id="citem_0"]
        driver.find_element_by_xpath("//*[@id="citem_0"]").click()
    
        to_element = driver.find_element_by_id("toStationText")
        to_element.click()
        time.sleep(2)
        to_element.send_keys("长春")
        driver.find_element_by_xpath("//*[@id="citem_1"]/span[1]").click()
        #去掉readonly属性
        js = "$('input[id=train_date]').removeAttr('readonly')"
        driver.execute_script(js)
        #清空内容输入值,测试时无法clear,需要找原因
        # date_element = driver.find_element_by_id("train_date").click()
        # time.sleep(2)
        # date_element.clear()
        # time.sleep(5)
        # date_element.send_keys("2019-05-28")
        #使用js修改日期
        js_value = 'document.getElementById("train_date").value="2019-05-28"'
        driver.execute_script(js_value)
        driver.find_element_by_class_name("form-label").click()
    
        #直接点击查询按钮
        driver.find_element_by_id("search_one").click()
    
    
    finally:
        time.sleep(2)
    View Code

    改变日期有两种方法:


    driver.get("https://kyfw.12306.cn/otn/index/init")
    # 去掉元素的readonly属性
    js = 'document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)

    # 用js方法输入日期
    js_value = 'document.getElementById("train_date").value="2016-12-25"'
    driver.execute_script(js_value)

    # # 清空文本后输入值
    # driver.find_element_by_id("train_date").clear()
    # driver.find_element_by_id("train_date").send_keys("2016-12-25")

    但是click()一直有问题,后面用了js的方式,并且js方法更方便

     Selenium:利用select模块处理下拉框

    首先导入Select模块:

    1 # coding=utf-8
    2 from selenium import webdriver
    3 from selenium.webdriver.support.select import Select

    Select提供了三种选择

    1 select_by_index          # 通过索引定位
    2 select_by_value          # 通过value值定位
    3 select_by_visible_text   # 通过文本值定位

    index索引是从“0”开始;

    value是option标签的一个属性值,并不是显示在下拉框中的值;

    visible_text是在option标签中间的值,是显示在下拉框的值;

    Select提供了三种返回options信息的方法

    1 options                  # 返回select元素所有的options
    2 all_selected_options     # 返回select元素中所有已选中的选项
    3 first_selected_options   # 返回select元素中选中的第一个选项

    这三种方法的作用是查看已选中的元素是否是自己希望选择的:

    options:提供所有选项的元素列表;

    all_selected_options:提供所有被选中选项的元素列表;

    first_selected_option:提供第一个被选中的选项元素;

    Select提供了四种取消选中项的方法

    1 deselect_all             # 取消全部的已选择项
    2 deselect_by_index        # 取消已选中的索引项
    3 deselect_by_value        # 取消已选中的value值
    4 deselect_by_visible_text # 取消已选中的文本值
    # coding=utf-8
    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from time import sleep
    
    # 登录
    driver = webdriver.Chrome()
    ......
    
    # 根据索引选择
    Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_index("3")
    # 根据value值选择
    Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_value("3线")
    # 根据文本值选择
    Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_visible_text("3线")
    sleep(5)
    driver.quit()
    打印 tile
    driver.get('http://www.baidu.com')
    print(driver.title) # 把页面 title 打印出来
    将浏览器最大化显示
    browser.maximize_window() #将浏览器最大化显示
    设置浏览器宽、高
    操作浏览器的前进、后退
    #"设置浏览器宽480、高800显示"
    browser.set_window_size(480, 800)
    browser.back() 返回
    browser.forward()  前进
    send_keys("xx") 用于在一个输入框里输入 xx 内容。
    click() 用于点击一个按钮。
    clear() 用于清除输入框的内容
    #通过 submit() 来操作
    driver.find_element_by_id("su").submit()
    text 获取元素文本
    data=driver.find_element_by_id("cp").text
    get_attribute 获得属性值
    select = driver.find_element_by_tag_name("select")
    allOptions = select.find_elements_by_tag_name("option")
    for option in allOptions:
        option.get_attribute("value")
    鼠标事件
    ActionChains 类
    from selenium.webdriver.common.action_chains import ActionChains
    
    qqq =driver.find_element_by_xpath("xxx")
    
    #对定位到的元素执行鼠标右键操作
    ActionChains(driver).context_click(qqq).perform()
    
    #对定位到的元素执行鼠标双击操作
    ActionChains(driver).double_click(qqq).perform()
    
    
    #定位元素的原位置
    element = driver.find_element_by_name("source")
    #定位元素要移动到的目标位置
    target = driver.find_element_by_name("target")
    
    #执行元素的移动操作
    ActionChains(driver).drag_and_drop(element, target).perform()
    定位一组元素
    # 选择所有的 checkbox 并全部勾上
    checkboxes =
    dr.find_elements_by_css_selector('input[type=checkbox]')
    for checkbox in checkboxes:
    checkbox.click()
    time.sleep(2)
    # 把页面上最后1个 checkbox 的勾给去掉
    dr.find_elements_by_css_selector('input[type=checkbox]').pop().cl
    ick()
    多层框架/窗口定位
    本节知识点:
    多层框架或窗口的定位:
    switch_to_frame()
    switch_to_window()
    对于一个现代的 web 应用,经常会出现框架(frame) 或窗口(window)的应用,
    这也就给我们的定位带来了一个难题。
    有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这
    个元素是否在一个 frame 中,seelnium webdriver 提供了一个 switch_to_frame 方
    法,可以很轻松的来解决这个问题。
    f1中嵌套f2
    
    #先找到到 ifrome1(id = f1)
    browser.switch_to_frame("f1")
    #再找到其下面的 ifrome2(id =f2)
    browser.switch_to_frame("f2")
    browser.find_element_by_id("kw").send_keys("selenium")
    browser.find_element_by_id("su").click()
    多层窗口定位
    用法与 switch_to_frame 相同:
    driver.switch_to_window("windowName")
    下拉框处理
    处理下拉框
       switch_to_alert()
       accept()
    #先定位到下拉框
    m=driver.find_element_by_id("ShippingMethod")
    #再点击下拉框下的选项
    m.find_element_by_xpath("//option[@value='10.69']").click()
    当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定
    位弹窗上的“确定”按钮,而是使用:
    driver.switch_to_alert().accept()
    alert、confirm、prompt 的处理
    text 返回 alert/confirm/prompt 中的文字信息
    accept 点击确认按钮
    dismiss 点击取消按钮,如果有的话
    end_keys 输入值,这个 alertconfirm 没有对话框就不能用了,不然会报错。
  • 相关阅读:
    sklearn库学习笔记1——preprocessing库
    juypter notetbook
    信用卡欺诈
    matplotlib1
    python一行输入多个数
    pandas数据预处理
    pandas基础用法
    numpy简单用法2
    numpy 简单用法
    简单循环
  • 原文地址:https://www.cnblogs.com/Aline2/p/10584806.html
Copyright © 2011-2022 走看看