python、selenium自动化功能测试

python+selenium代码测试自动化(也叫web自动化或ui自动化)

为什么要进行自动化测试?

  1. 原因
    1. 解决回归测试、压力测试、兼容性测试
    2. 提高测试效率保证产品质量
  2. 相关解释
    1. 回归测试:项目在发布新版本之前进行的功能验证
    2. 压力测试:可以理解多用户去操作软件,统计服务器处理用户请求的能力
    3. 兼容性测试:表示在不同浏览器下软件运行状态
  3. 如下三种情况一般需要使用自动化?
    1. 需求变动不频繁
    2. 项目周期长
    3. 项目需要回归测试

python相关设置

  1. file→project Interpreter→existing interpreter→选择python的安装位置→选中python.exe

  2. 关闭严格模式

    1. 波浪线设置界面从PyCharm界面右下角的小人图标进入

    2. 进入波浪线设置界面看看到上方有三个设置项None、Syntax、Inspections,可以拖动箭头设置。

      1. None表示没有波浪线
      2. Syntax表示只有语法错误显示波浪线
      3. Inspections表示语法错误和不符合PEP8规范显示波浪线
  3. 格式化代码 ctrl+alt+l

selenium相关内容

  1. 元素的定位

    1. id定位 find_element_by_id("kw") 注:有些id值动态变化

    2. class_name定位 find_element_by_class_name("s_ipt") 注:classname有可能重复

    3. tag_name定位 find_element_by_tag_name("input") 注:tagname最容易重复

    4. name定位 find_element_by_name("wd") 注:name有可能重复

    5. link文字精确定位 find_element_by_link_text("登录")

      扫描二维码关注公众号,回复: 8590786 查看本文章
    6. link文字模糊定位 find_element_by_partial_link_text("登")

    7. CSS定位

      1. 标签名定位 find_element_by_css_selector("input")
      2. id定位 find_element_by_css_selector("#kw")
      3. class定位 find_element_by_css_selector(".s_ipt")
      4. 属性定位 find_element_by_css_selector("[name='wd']") find_element_by_css_selector("[maxlength='255']")
      5. 父子定位 find_element_by_css_selector("span>input")
      6. 组合定位 右击-复制-CSS路径 find_element_by_css_selector("input#kw") find_element_by_css_selector("input.s_ipt") find_element_by_css_selector("input[name='wd']") find_element_by_css_selector("span>input.s_ipt")
    8. XPath定位 右击-复制-XPath

      1. 属性定位 find_element_by_xpath("//标签名[@属性='属性值']")
      2. 标签名定位 find_element_by_xpath("//input")
      3. 父子定位 find_element_by_xpath("//span/input")
      4. 元素内容定位 find_element_by_xpath("//标签名[contains(text(),'内容')]")
      5. 组合定位 find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")
  2. webdriver对象的方法

    1. browser.save_screenshot('.//baidu.png') 屏幕快照

    2. 切换窗口

      """
      浏览器打开两个窗口,每个窗口都有控制句柄handles
      handles的值是列表list,handles[0]代表第1个窗口,handles[1]代表第2个窗口
      """
      handles = browser.window_handles
      browser.switch_to.window(handles[1])  # 切换到第2个窗口
      print(browser.title)  # 打印第2个窗口的标题
      
      # 切换到frame子页面
      browser.switch_to.frame('iframeResult')
      time.sleep(3)
      browser.find_element_by_xpath('/html/body/a').click()
      #browser.find_element_by_link_text('这是一个链接使用了 href 属性').click()
      time.sleep(3)
      # 切回父页面(必须执行)
      browser.switch_to.default_content()
      
      #browser.find_element_by_css_selector('html body a').click()
      #time.sleep(3)
      
      browser.quit()
      
    3. 警告框

      browser.switch_to.frame('iframeResult')
      
      browser.find_element_by_css_selector('html body input').click()
      time.sleep(3)
      
      info = browser.switch_to.alert.text  # 显示警告框的内容
      print(info)
      
      time.sleep(3)
      
      browser.switch_to.alert.accept()  # 点击确定
      #browser.switch_to.alert.dismiss()  # 点击取消
      
      time.sleep(3)
      
      browser.quit()
      
    4. 下拉框

      browser.switch_to.frame('iframeResult')
      
      select_element = browser.find_element_by_name('cars')
      
      Select(select_element).select_by_index(1)  # 按索引选择
      time.sleep(3)
      
      Select(select_element).select_by_visible_text('Audi')  # 按内容选择
      time.sleep(3)
      
      Select(select_element).select_by_value('fiat')  # 按value属性值选择
      time.sleep(3)
      
      # is_select() 记录控件是否被选中,如果被选中,则返回true;如果没被选中,则返回false.
      is_select = browser.find_element_by_name('cars').is_selected()
      if is_select == False:
          browser.find_element_by_name('cars').click()
      time.sleep(3)
      
      browser.quit()
      
      
    5. 悬浮框

      drviver.get('https://www.baidu.com')
      
      button = drviver.find_element_by_css_selector('#u1>a.bri')
      
      # 将鼠标移至更多产品上
      ActionChains(drviver).move_to_element(button).perform()
      
      # 点击音乐
      drviver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[4]/div/div[2]/div[1]/div/a[2]/span').click()
      
      time.sleep(3)
      
      drviver.quit()
      
    6. 显示隐藏

      from selenium import webdriver
      import unittest
      from selenium.webdriver.support.wait import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      
      class Content(unittest.TestCase):
          def testShow(self):
              self.browser = webdriver.Chrome()
              self.browser.get("https://www.baidu.com")
              self.element = WebDriverWait(self.browser, 5, 1).until(EC.presence_of_element_located((By.ID, "kw")))
              self.browser.quit()
      
          def testHidden(self):
              self.browser = webdriver.Chrome()
              self.browser.implicitly_wait(5)
              self.browser.get("https://www.baidu.com")
              self.browser.quit()
      
      
      if __name__ == '__main__':
          unittest.main(verbosity=2)
      
      
  3. 常规参数化全过程用例(只有登录)

    from selenium import webdriver
    import time
    import unittest
    import csv
    
    
    # 创建一个类继承unittest.TestCase
    class Login(unittest.TestCase):
        # 打开浏览器
        def setUp(self) -> None:
            self.browser = webdriver.Chrome()
            self.browser.get("http://192.168.159.1:8082/")
    
        # 结束关闭浏览器
        def tearDown(self) -> None:
            self.browser.quit()
        # 参数化登录信息
        def login(self, username, password):
            self.browser.find_element_by_xpath("//*[@id='shop_header']/div[2]/ul/li[7]/a").click()
            time.sleep(3)
            self.browser.find_element_by_id("user_name").send_keys(username)
            self.browser.find_element_by_id("user_password").send_keys(password)
            self.browser.find_element_by_xpath("//*[@id='login_form']/div[4]/div/button[1]").click()
            time.sleep(3)
        def logout(self):
            self.browser.find_element_by_link_text('退出').click()
        def testLogin(self):
            file = open("login.csv", mode="r", encoding="utf-8")
            logins = csv.reader(file)
            for login in logins:
                try:
                    username = login[0]
                    password = login[1]
                    self.login(username, password)
                    self.assertTrue(self.browser.find_element_by_link_text("退出"))
                    self.logout()
                except Exception as Error:
                    print(Error)
            file.close()
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
  4. 改良版本全功能测试用例(缩短代码量)

    # 登录模块
    from selenium import webdriver
    import unittest
    import time
    import csv
    class Login(unittest.TestCase):
        def setUp(self) -> None:
             self.browser=webdriver.Chrome()
             self.browser.get("http://192.168.159.1:8082/")
             time.sleep(3)
        def tearDown(self) -> None:
             self.browser.quit()
        # 定义登录带参函数
        def login(self,username,password):
            self.browser.find_element_by_xpath("//*[@id='shop_header']/div[2]/ul/li[7]/a").click()
            time.sleep(3)
            self.browser.find_element_by_id("user_name").send_keys(username)
            self.browser.find_element_by_id("user_password").send_keys(password)
            self.browser.find_element_by_xpath("//*[@id='login_form']/div[4]/div/button[1]").click()
            time.sleep(3)
        # 定义退出函数
        def loginOut(self):
            self.browser.find_element_by_link_text("退出").click()
        # 登录成功测试
        def testLoginSuccess(self):
            self.login("wupeng","123456")
        # 用户名为1测试
        def testUserNull(self):
            self.login("","123456")
            # self.assertTrue(self.browser.find_element_by_xpath("//*[@id='login_form']/div[2]/div/label").text=="请输入会员登录名称!")
            info=self.browser.find_element_by_xpath("//*[@id='login_form']/div[2]/div/label").text
            self.assertIn("请输入会员登录名称",info)
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
     
    # 搜索模块
    from login import dbSlogin
    import unittest
    import time
    
    class Search(unittest.TestCase):
        myself=dbSlogin.Login
        myself.setUp(myself)
        myself.login(myself,"wupeng","123456")
    
        # 输入正确搜索字段搜索
        def testSearch(self):
            self.myself.browser.find_element_by_xpath("//*[@id='shop_top_search']/form/div/input").send_keys("苹果")
            self.myself.browser.find_element_by_xpath("//*[@id='shop_top_search']/form/div/button").click()
            time.sleep(3)
            self.myself.tearDown(self.myself)
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
  5. 生成报告

    1. 在测试用例文件同目录下添加9run_all_testcases.py文件
    2. 在测试用例文件同目录下添加HTMLTestReport.py文件

猜你喜欢

转载自www.cnblogs.com/wp950416/p/12191221.html