美文网首页
web自动化小记

web自动化小记

作者: 莫念数不清的心事 | 来源:发表于2020-12-29 09:40 被阅读0次

    目录

    1. selenium webdriver环境安装、原理
    2. 前端页面、html、DOM对象
    3. 8大元素定位、xpath详解
    4. web常用元素操作
    5. PageObject模式应用、自动化用例设计
    6. 分层设计
    7. basepage页面提取
    8. pytest框架应用
    9. jenkins 集成
    10. allure报告集成

    代码 --通过-- 驱动器 --连接-- 浏览器
    chrome (chromedriver)
    ie (IEserverdriver)
    firefox (geckodriver)

    web页面组成

    常用 HTML+CSS+Javascript
    HTML:定义页面呈现的内容 键值对
    CSS:控制你的网页如何呈现。即布局设置 颜色 字体等
    JavaScript:页面依据不同的情形做不同的事情 JavaScript就是实现这个的编程语言的一种

    安装selenium+chrome+Chromedriver

    selenium - webdriver

    # learn_selenium_webdriver.py
    from selenium import webdriver
    
    # service_log_path 日志输出路径
    # 启动谷歌浏览器,开启与浏览器之间的会话
    # 原理 chromedriver -> commend命令 -> http请求 -> chrome
    # window10 会自动杀掉多余的chromedriver进程 windows7就不会
    driver = webdriver.Chrome(service_log_path='')
    
    # 访问一个网页
    driver.get('http://www.baidu.com')
    
    # 窗口最大化
    driver.maximize_window()
    
    # driver.set_window_size(100,200)
    
    # 访问
    driver.get('http://www.taobao.com')
    # 上一页
    driver.back()
    # 下一页
    driver.forward()
    # 刷新
    driver.refresh()
    
    print('网页标题',driver.title)
    print('网页网址',driver.current_url)
    print('窗口句柄',driver.current_window_handle)
    
    # 彻底结束会话 关闭刚打开的浏览器
    # driver.quit()
    
    # 关闭当前窗口(一个标签页)
    # driver.close()
    

    定位元素

    截屏2020-11-27 下午2.20.06.png
    html中的datatype https://www.jianshu.com/p/75caa9c46fdd
    # find_element.py
    from selenium import webdriver
    
    # service_log_path 日志输出路径
    # 启动谷歌浏览器,开启与浏览器之间的会话
    # 原理 chromedriver -> commend命令 -> http请求 -> chrome
    # window10 会自动杀掉多余的chromedriver进程 windows7就不会
    driver = webdriver.Chrome(service_log_path='')
    
    # 访问一个网页
    driver.get('http://www.baidu.com')
    
    # 元素定位 没有 id 优先选name
    
    # 方式一
    ele = driver.find_element_by_id('kw')
    print(ele)
    print(ele.get_attribute('class'))
    
    # 方式二
    class_eles = driver.find_elements_by_class_name('s_ipt')
    print('数组', class_eles)
    class_ele = driver.find_element_by_class_name('s_ipt')
    print(class_ele)
    
    # 方式三
    driver.find_elements_by_class_name('wd')
    driver.find_element_by_class_name('wd')
    
    # 方式四
    driver.find_element_by_tag_name('input')
    driver.find_elements_by_tag_name('input')
    
    # 方式五、六  针对链接 文本链接(图片链接不可)
    driver.find_element_by_link_text('更多产品')  # 精确查找
    driver.find_element_by_partial_link_text('产品')  # 模糊查找
    
    # ------万能定位方式 不打开网页的情况下 获取------
    # 方式七 xpath
    
    driver.find_element_by_xpath('//a[@name = "tj_login" and @class="lb"]')
    # 相对定位 以// 开头, 不依赖页面的顺序位置,只看 整个页面有没有符合表达式的元素
    # !!! F12的Element区域 command + F(Windows control+F) find by string,selector,or xpath
    """
    xpath 表达式
    1.默认找到第一个元素 属性名称最好粘贴 防止写错
    //开头 标签类型[@属性名称=值 and @属性名称=值]
    多个条件用 and or 逻辑运算符连接  and前后有空格
    //input[@name="rsv_bp" and @]
    //a[@name = "tj_login" and @class="lb"]
    2.层级等位 找到 这个元素的父标签
    //div[@id="u1"]//a[@name = "tj_login"]
    
    
    3.开发没有写 name id 之类的 定位不到的时候 还可以采取用
    text()函数
    //a[text()="知道"]
    contains() 包含
    //a[contains(@class,"more")]
    """
    """
    xpath轴定位语法
    轴运算
    ancestor : 祖先节点,包括父
    parent: 父节点
    preceding-sibling : 当前元素节点标签之前的所有兄弟节点
    following-sibling :当前元素节点标签之后的所有兄弟节点
    
    使用语法
    /轴名称::节点名称[@属性=值....]
    //span[text()="python10"]/ancestor::a/following-sibling::div//a
    """
    
    # 绝对定位 以/开头  非常依赖页面的顺序和位置 录制的就是绝对定位 经常变动
    # F12 选中元素 右键 Copy -> Copy xPath
    
    # css
    
    

    还是用到了 下标 这个不好 不会写
    轴定位 百度贴吧 人文 江西会考的文字
    //div[text()="人文自然"]/following-sibling::div[1]/ul[1]/li[1]/a/div/p[@class="bft_forum_name"]

    截屏2020-11-27 下午3.57.58.png

    等待

    # learn_wait.py
    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.implicitly_wait(30)
    
    driver.get('https://www.pgyer.com')
    
    # 强制等待 sleep(秒)
    
    # 显性等待
    # 元素定位表达式
    ele_xpath = '//li[@class="menu-li"]//a[text()="登录"]'
    # 参数 locator 元组 (元素的定位类型,元素的定位表达式)
    locator = (By.XPATH, ele_xpath)
    WebDriverWait(driver, 10).until(EC.visibility_of_any_elements_located(locator))
    
    login_ele = driver.find_element_by_xpath(ele_xpath)
    login_ele.click()
    
    # 目标在页面的iframe下边 需要切换到该iframe
    # 进入了另一个html页面
    # # 方式一
    # driver.switch_to.frame('login_frame_qq')  # 1.根据名字
    # # 2.根据下标
    # # 3.根据xpath定位
    # iframe_xpath = '//iframe[@name="login_frame_qq"]'
    # driver.switch_to.frame(driver.find_element_by_xpath(iframe_xpath))
    # time.sleep(0.5)
    # driver.find_element_by_id('switcher_plogin')
    
    # # 方式二
    # WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("login_frame_qq"))
    
    # 从iframe当中 回到默认的页面中
    driver.switch_to.default_content()
    # 回到上一级
    driver.switch_to.parent_frame()
    
    • css表达式定位


      拿到列表中所有的title

        goods_title_css = '.goods-list .title'
        WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, goods_title_css)))
        goods_items = driver.find_elements_by_css_selector(goods_title_css)
        goods_items_titles = [item.text for item in goods_items]  #  这个是python的语法 列表生成
        assert search_text in goods_items_titles式
    

    句柄 窗口切换

    # learn_handle.py
    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.find_element_by_id('kw').send_keys('柠檬班')
    driver.find_element_by_id('su').click()
    
    n_tieba_xpath = '//p[contains(text(),"柠檬班,腾讯课堂唯一连续4年认证机构")]/ancestor::div[@class="result c-container"]/preceding-sibling::h3/a'
    located = (By.XPATH, n_tieba_xpath)
    WebDriverWait(driver, 20).until(EC.visibility_of_any_elements_located(located))
    
    handles = driver.window_handles  # 窗口总数为2
    
    # 点击了 引起了窗口数量的变化
    driver.find_element_by_xpath(n_tieba_xpath).click()
    
    # 等待新窗口的出现
    WebDriverWait(driver, 10).until(EC.new_window_is_opened(handles))
    
    # 窗口切换
    handles = driver.window_handles  # 窗口总数为3
    # 切换句柄
    driver.switch_to.window(handles[-1])
    
    # 窗口切换
    #
    # # step1:获取窗口的总数以及句柄 新打开的窗口在最后一个
    # handles = driver.window_handles
    # print(handles)
    # print(handles[-1])
    # print(handles[0])
    #
    # # 当前窗口的句柄
    # print('当前窗口的句柄', driver.current_window_handle)
    #
    # # step2 切换句柄
    # driver.switch_to.window(handles[-1])
    
    # 新的页面操作
    WebDriverWait(driver, 20).until(EC.visibility_of_any_elements_located((By.ID, "j_head_focus_btn")))
    driver.find_element_by_id("j_head_focus_btn").click()
    
    
    time.sleep(120)
    driver.quit()
    

    切换alert

    # learn_alert.py
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    
    import time
    
    driver = webdriver.Chrome()
    driver.get(r"C:\Users\DN\Desktop\Python_Test_Project\pythonProject_web\pythonProject_web\learn\learn_html.html")
    
    # 等待alert出现
    WebDriverWait(driver, 10).until(EC.alert_is_present())
    # alert切换  不是html元素
    alert_new = driver.switch_to.alert
    print(alert_new.text)
    # alert_new.dismiss()
    time.sleep(10)
    alert_new.accept()
    
    
    time.sleep(120)
    driver.quit()
    

    鼠标操作

    由selenium的ActionChains类来完成模拟鼠标操作的
    主要流程:1.存储鼠标操作 ;2.perfrom()来执行鼠标操作
    支持以下操作:double_click content_click drag_and_drop move_to_element
    perform()
    单击、双击、右键、悬停

    获取web页面鼠标悬浮的列表
    chrome
    光标在Element区域
    鼠标移动到 悬浮会出现列表的元素上 -> 出现列表 -> 按一下 ctrl+shift+C -> 鼠标移动到想要操作的元素列表项上
    单击该列表项 就可以找到该元素

    下拉列表 select 类

    # learn_mouse.py
    import time
    
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.by import By
    
    
    # 能用点击操作就不要用鼠标操作,不稳定
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://www.baidu.com')
    
    # 1.找到鼠标要操作的元素
    set_xpath = '//div[@id="u1"]//span[@id="s-usersetting-top"]'
    set_sel = driver.find_element_by_xpath(set_xpath)
    
    # # 2.实例化ActionChains类
    # ac = ActionChains(driver)
    #
    # # 3。将鼠标操作加到 ActionChains列表中
    # ac.move_to_element(set_sel)
    #
    # # 4.调用perform()来执行鼠标操作
    # ac.perform()
    
    # ActionChains(driver).move_to_element(set_sel).perform()
    
    # 通过点击就能实现
    set_sel.click()
    
    high_set_xpath = '//a[text()="高级搜索"]'
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, high_set_xpath)))
    high_set = driver.find_element_by_xpath(high_set_xpath)
    high_set.click()
    
    # # 下拉列表 select 标签 Select类
    # from selenium.webdriver.support.select import Select
    # # 1.找到select元素
    # select_xpath = '//select[@name="ft"]'
    # WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, select_xpath)))
    # select_ele = driver.find_element_by_xpath(select_xpath)
    # 
    # # 2.实例化Select类
    # s = Select(select_ele)
    # 
    # # 3.选择下拉列表值
    # # 方式一:下标从0开始
    # s.select_by_index(4)
    # # 方式二:value值
    # s.select_by_value("all")
    # # 方式三:文本内容
    # s.select_by_visible_text("Adobe Acrobat PDF (.pdf)")
    
    

    键盘操作

    # @File: learn_keys.py
    # @Author: MJ
    # @Time: 2020/11/28 20:00
    # ---
    from selenium.webdriver.common.keys import Keys
    import time
    
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.by import By
    
    # 能用点击操作就不要用鼠标操作,不稳定
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('柠檬班', Keys.ENTER)
    
    #
    # 滚动条操作,如果被测系统太长 不在可视范围内报错  需要滚动排除不在可视范围内的原因
    # 1.找打要滚动到可视区域的元素
    baike_xpath = '//a[@title="核心价值观"]/ancestor::div[contains(@class, "c-span9")]/preceding-sibling::div/a'
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, baike_xpath)))
    baike_ele = driver.find_element_by_xpath(baike_xpath)
    
    # 2.使用js进行滚动操作
    driver.execute_script("arguments[0].scrollIntoView(false)", baike_ele)
    
    # js语句
    
    time.sleep(120)
    driver.quit()
    
    

    arguments[0].scrollIntoView(false) 滚动到可视区域的底部

    上传操作

    1. 如果是input可以直接输入路径的,那么直接调send_keys输入路径
    2. 非input标签的上传,则需要借助第三方工具:
      2.1 Auto 我们去调用其生成的au3或exe文件https://blog.csdn.net/qq_42293487/article/details/84662376
      2.2 SendKeys第三方库(目前只支持到2.7版本)https://pypi.python.org/pypi/SendKeys
      2.3 Python pywin32库,识别对话框句柄,进而操作
      -- mac
    3. pyautoit
    4. https://blog.csdn.net/rp517045939/article/details/103211496
      工具: pywin32 和 spy++(执行python代码)
      Winspy++ Baidu盘
    # -*- coding: utf-8 -*-
    # ---
    # @PROJECT_NAME: pythonProject_web
    # @File: upload_file.py
    # @Author: MJ
    # @Time: 2020/11/30 11:00 上午
    # ---
    import win32gui
    import win32con
    
    
    class UploadFile:
    
        @staticmethod
        def upload_file_win(filePath, browser):
            w_title = '打开'
            if browser.lower() == 'chrome':
                w_title = '打开'
                
            # 一级窗口
            dialog = win32gui.FindWindow('#32770', w_title)
            # 二级窗口
            comboxex32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
            # 三级窗口
            combox = win32gui.FindWindowEx(comboxex32, 0, 'ComboBox', None)
            # 文本的输入窗口 - 四级
            edit = win32gui.FindWindowEx(combox, 0, 'Edit', None)
            # 打开按钮 - 二级窗口
            button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&0)')
    
            # 输入文件地址
            win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)  # 发送文件路径
            # 点击 打开按钮 提交文件
            win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
    
    

    自动化测试用例 编写

    截屏2020-11-30 下午1.42.56.png

    PageObject 模式

    原理:
    将页面的元素定位和元素行为封装成一个page类
    类的属性:元素的定位
    类的行为:元素的操作
    页面对象和测试用例分离。
    测试用例:
    调用所需页面对象中的行为,组成测试用例。
    好处:

    1. 当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改。
    2. 提高代码重用率,结构清晰,维护代码更容易
    3. 测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可

    持续集成的一种方式 Jenkins

    Master/Slave 模式
    Master 安装了Jenkins的电脑(管理者)
    Slave 小弟 其他电脑

    1. slave向Master报告
      Manager Jenkins
      -> Manage Nodes(节点管理)
      -> New Node
      -> Node Name;Permanent Agent(永久节点)OK
      -> # of executors(执行能力,根据执行机性能分配 给分配几个任务 1/2/3)
      Remote root directory(远程工作目录,放下载的代码的目录)
      Usage use this ...(随时待命,给我什么都可以) Only build...(只执行分配给他的任务)
      Launch method
      Launch agent via Java Web Start (Windows)
      ...master (linux、mac)
      ...SSH (linux、mac)
      Available...keep...

    相关文章

      网友评论

          本文标题:web自动化小记

          本文链接:https://www.haomeiwen.com/subject/unzaiktx.html