• 自动化测试学习记录知识点


    自动化测试记录

    隐式等待

    wb.implicitly_wait(5)
    
    implicitly_wait(xx),隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。
    
    

    强制等待

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Firefox()
    driver.get('https://huilansame.github.io')
    sleep(3) # 强制等待3秒再执行下一步
    print driver.current_url
    driver.quit()
    
    最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。
    
    这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
    
    

    切换iframe窗口

    wb.switch_to.frame('iframe1')   # 切换窗口
    
    # wd.switch_to.frame(frame_reference)
    # 其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。
    # 比如这里,就可以填写 iframe元素的id ‘frame1’ 或者 name属性值 ‘innerFrame’。
    

    handle 句柄

    selenium遇到无法定位元素解决方法,首先判定是不是alert,再判定是不是iframe,如果都不能解决就使用selenium的handle处理方式再进行定位操作:
    
    # 打印全部的handle
    
    
    all_handle = driver.window_handles
    
    #打印当前的handle
    
    
    handle = driver.current_window_handle
    # 切换到新的handle上
    
    
    driver.switch_to.window(handle)
    
    
    

    selenium中的三大切换(handle窗口、iframe切换、alert弹框)

    handle窗口切换

    一、handle窗口切换
    
    当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法。
    
    常用方法:
    
    window_handles:获取当前打开的所有窗口句柄,返回类型为一个列表。
    
    current_window_handle:获取当前窗口的句柄。
    
    switch_to.window(handle_path):切换窗口,handle_path参数代表的是一个窗口句柄。
    
    当操作某个元素后需要等待新的元素出现,我们用到了显性等待,EC给了我们一个方法为visibility_of_element_located(),表示元素可见,那么在handle窗口切换时也涉及到等待,那就是等待新的窗口打开,我将用一般方法和新的方法来展示,具体用法如下:
    
    (使用time.sleep()强制等待):
    
    import time
    
    from selenium import webdriver
    
    from selenium.webdriver.support.wait import WebDriverWait
    
    from selenium.webdriver.support import expected_conditions as EC
    
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    
    driver.get("http://www.baidu.com")
    
    driver.maximize_window()
    
    driver.find_element_by_id("kw").send_keys("python")
    
    driver.find_element_by_id("su").click()
    
    loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
    
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
    
    driver.find_element(*loc).click() # 点击后新的窗口出现
    
    # 切换到新的窗口,在新窗口去操作元素
    
    time.sleep(1) # 强制等待1秒
    
    # 1、获取当前打开的所有窗口。--- 窗口列表。handles
    
    wins = driver.window_handles
    
    print(wins)
    
    # 打印打前窗口的句柄
    
    print(driver.current_window_handle)
    
    # 2、切换的语句 ,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
    
    driver.switch_to.window(wins[-1])
    
    # 3、在新的页面当中,找元素,并操作
    
    loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
    
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
    
    driver.find_element(*loc).click()
    
     
    
    
    

    iframe 切换

    img

    二、iframe切换
    
    iframe表示在主html上嵌入的子html页面如下图所示:
    
    
    当我们要在新的html页面操作元素,就要切换到新的html页面后才能进行接下来的操作,常用方法如下:
    
    switch_to.frame(path):切换到新的html页面,path支持下标、name、WebElement对象三种参数
    
    switch_to.default_content():切换到主html页面
    
    switch_to.parent_frame():切换到上一层html页面(父页面)
    
    在iframe切换中也有等待,除了使用time.sleep()方法外,EC给了我们一个方法为frame_to_be_available_and_switch_to_it(),表示iframe有效并切换到iframe当中,它支持下标、name、WebElement对象以及元组四种方法传参。
    
     
    
    
    

    alert弹窗切换

    三、alert弹框切换
    
    如何区分是alert弹框呢?一个简单的方法就是无法使用元素定位的弹框,并且需要优先处理后才能操作后面的元素,常用方法如下:
    
    switch_to.alert:切换到alert弹框
    
    accept():确定
    
    dismiss():取消
    
    send_keys(keysToSend) :输入文本,keysToSend表示输入的文本内容字符串
    
    text():获取弹出框里面的内容
    
    在EC里面也给alert弹框设定了一个方法,alert_is_present()方法表示等待alert弹框出现并切换到alert弹框中
    
    方法一(常规做法):
    
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    
    driver.maximize_window()
    
    driver.get("http://XXXX")
    
    # 做一个操作,导致alert框出现
    
    driver.find_element_by_id("idxxx").click()
    
    # 切换到alert弹框
    
    alert = driver.switch_to.alert
    
    # 获取alert的文本内容
    
    print(alert.text)
    
    # 点击确定,关闭弹框
    
    alert.accept()
    
    方法二(使用骚操作EC.alert_is_present()方法):
    
    from selenium import webdriver
    
    from selenium.webdriver.support.wait import WebDriverWait
    
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    
    driver.maximize_window()
    
    driver.get("http://XXXX")
    
    # 做一个操作,导致alert框出现
    
    driver.find_element_by_id("idxxx").click()
    
    # EC条件 -- 等待alert弹框出现,并切换到alert当中
    
    alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
    
    # 获取alert的文本内容
    
    print(alert.text)
    
    # 点击确定,关闭弹框
    
    alert.accept()
    

    HTML注释

    注释标签 用于在 HTML 插入注释。

    切换窗口

    mainWindow = wb.current_window_handle
    wb.switch_to.window(mainWindow)
    
    --------------------
    
    for handle in wb.window_handles:
        wb.switch_to.window(handle)
        print(wb.title)
    
    
    
    

    下拉单选框

    from selenium.webdriver.support.ui import Select  # 导入Select类
    select = Select(wb.find_element_by_xpath('//*@id="formobj"]/table/tbody/tr[2]/td[4]/select')) 
    
    # 创建Select对象
    
    select.select_by_visible_text('城区+村镇') #根据选项的 可见文本 ,选择元素。
    
    select.select_by_index()  #根据选项的 次序 (从0开始),选择元素
    
    select.select_by_value() #根据选项的 value属性值 ,选择元素。
    
    
    

    PIL模块安装

    D:develop_studypythonPytho38-32>pip install Pillow	
    

    图片验证码识别

    首先得装环境,识别验证码已经不是selenium自己能办到的了。cmd下输入下面命令:

    pip install Pillow(如果报错,输入:pip.exe install Pillow)

    pip install pytesseract(如果报错,输入:pip.exe install pytesseract)

    第一个是对图片处理的包,第二个是识别验证码的包,还需要下载个包,百度搜索:Tesseract-OCR,下载解压到电脑,可以不放在C盘,这个好像也没有位数限制。

    解压到电脑以后需要加上环境变量,在path里加上Tesseract-OCR的路径,然后在pycharm里(我只用这个,别的工具什么情况我不知道),External Libraries->Python 3.x->Lib->site-packages->pytesseract->pytesseract.py里面修改一段代码:
    ————————————————
    img

    由于斜杠是转义字符,我就用了双斜杠,一定要看清不是只加到环境变量的那个路径,后面要加到tesseract.exe,我只记得这一个坑,执行脚本总是提示我未安装或者没配置环境变量。准备工作就这么多,下面我放上我的代码,供参考。

    验证码登陆

    from selenium import webdriver
    import time
    from PIL import Image
    import pytesseract
    import re
    
    wb = webdriver.Chrome(r'D:develop_studychromedriverchromedriver')
    wb.get('http://192.168.10.233:8080/marsCloud/loginController.do?login')
    
    wb.maximize_window()
    wb.implicitly_wait(5)
    wb.find_element_by_id('userName').send_keys('admin')
    wb.find_element_by_id('password').send_keys('123456')
    
    
    wb.save_screenshot('D:\security_code\printscreen.png')  # 截屏
    imgelement = wb.find_element_by_id('randCodeImage')  # 定位验证码
    location = imgelement.location  # 获取验证码x,y坐标
    print(location)
    size = imgelement.size # 验证码高度、宽度、
    print(size)
    
    left = int(location['x']+246)
    top = int(location['y']+75)
    right = int(location['x']+size['width']+263)
    bottom = int(location['y']+size['height']+83)
    
    
    img = Image.open('D:\security_code\printscreen.png').crop((left,top,right,bottom)) #打开截图
    img2 = img.convert('RGB')
    img2.save('D:\security_code\save.png')
    code = pytesseract.image_to_string(Image.open('D:\security_code\save.png'))
    print(code.strip())
    
    
    # 正则表达式去除空格或其他特殊符号
    b=''
    for i in code.strip():
        pattern = re.compile(r'[a-zA-Z0-9]')
        m = pattern.search(i)
        if m!=None:
            b+=i
        #输出去特殊符号以后的验证码
    print (b)
    
    
    wb.find_element_by_id('randCode').send_keys(b)
    wb.find_element_by_id('but_login').click()
    #
    # cookie = wb.get_cookies()
    # print(cookie)
    
    
    

    词云

    pip install wordcloud
    
    

    iframe切换失效修正

     xck = wb.find_element_by_xpath('/html/body/div[2]/table/tbody/tr[2]/td[2]/div/table/tbody/tr[2]/td[2]/div/iframe')
     
    # xpath 定位到新窗口对应iframe
    
    wb.switch_to.frame(xck)  # 切换到新窗口 iframe
    
    iframe = driver.find_elements_by_tag_name("iframe")[0]
    driver.switch_to.frame(iframe) (较新版本推荐使用方法)
    

    2、单据列表选择

  • 相关阅读:
    php中的imagettftext函数
    CMD命令
    Python基础学习笔记三
    java多线程中等待线程与被阻塞线程的区别
    转:hibernate中的N+1问题
    转:Mina2.0框架源码剖析(六)
    转:在Spring中配置Hibernate的事务
    转:Mina2.0框架源码剖析(八)
    转:Mina2.0框架源码剖析(五)
    转:JAVA集合框架思考
  • 原文地址:https://www.cnblogs.com/chenfei2928/p/12761261.html
Copyright © 2020-2023  润新知