파이썬, 셀레늄 자동화 된 기능 테스트

파이썬 + 셀레늄 자동화 코드 테스트 (또한 웹 UI 자동화 또는 자동화)

왜 테스트 자동화?

  1. 이유
    1. 해결 회귀 테스트, 스트레스 테스트, 호환성 테스트
    2. 테스트의 효율성을 개선하고 제품의 품질을 보장
  2. 관련 설명
    1. 회귀 테스트 : 새 릴리스 검증하기 전에 기능 프로젝트
    2. 스트레스 테스트 : 다중 사용자 운영 소프트웨어의 이해 될 수는 핸들 사용자에게 기능은 서버 통계를 요청
    3. 호환성 테스트 : 다른 브라우저에서 해당 소프트웨어 실행 상태
  3. 다음 세 가지 조건은 일반적으로 자동화의 사용을 필요로?
    1. 수요 자주 변경
    2. 긴 프로젝트주기
    3. 프로젝트는 회귀 테스트를 필요로

파이썬 설정

  1. 파일 → 프로젝트 통역 → 기존 통역 → → 선택 설치 위치 선택 파이썬 python.exe를

  2. 닫기 엄격 모드

    1. 물결 모양의 선은 악당 PyCharm 인터페이스에서 오른쪽 하단의 메뉴 아이콘을 선택

    2. 세 가지 설정 항목 없음, 구문, 검사는 위, 제공되는 화살표를 드래그 할 수 있습니다와 인터페이스로 제공되는 물결 모양의 라인에 참조하십시오.

      1. 아무도에는 물결 모양의 선을 나타냅니다
      2. 문법 구문 에러 표시 만 물결 선을 나타낸다
      3. 검사는 구문 오류를 표시 및 사양 PEP8 디스플레이 물결 모양의 라인을 충족하지 않습니다
  3. 포맷 코드 Ctrl + Alt + L

셀레늄 함량

  1. 요소의 위치 지정

    1. ID 포지셔닝 ( "kw") 주 find_element_by_id : 일부 동적 ID 값을 변경

    2. class_name에 위치 find_element_by_class_name ( "s_ipt") 참고 : 반복 할 가능성이 클래스 명

    3. TAG_NAME 위치 find_element_by_tag_name ( "입력") 주 : 태그 이름은 대부분 반복 될

    4. 이름 앵커 find_element_by_name ( "WD") 참고 : 이름은 가능성이 반복되는

    5. 링크 텍스트의 핀 포인트 find_element_by_link_text ( "로그인")

    6. 퍼지 텍스트 링크가 find_element_by_partial_link_text 위치 ( "보드")

    7. CSS 위치

      1. 이름표 위치 find_element_by_css_selector ( "입력")
      2. ID 定位 find_element_by_css_selector ( "#의 kw")
      3. 클래스 定位 find_element_by_css_selector ( ". s_ipt")
      4. 属性 定位 find_element_by_css_selector find_element_by_css_selector를 ( "[이름 ="WD "]") ( "[최대 길이 = '255']")
      5. 아들 위치 find_element_by_css_selector ( "SPAN> 입력")
      6. 组合 定位 右击 - 复制 -CSS 路径 find_element_by_css_selector ( "입력 # 1 kw") find_element_by_css_selector ( "input.s_ipt") find_element_by_css_selector ( "SPAN> input.s_ipt")를 find_element_by_css_selector ( "입력 [이름 ="WD "]")
    8. XPath는 위치를 마우스 오른쪽 버튼으로 클릭 - 복사를 -XPath

      1. 위치 속성 find_element_by_xpath ( "// 태그 이름 [부동산 @ = '속성']")
      2. 이름 태그 위치 find_element_by_xpath ( "// 입력")
      3. 아들 위치 find_element_by_xpath ( "// 스팬 / 입력")
      4. 요소 컨텐츠 find_element_by_xpath 위치 지정 ( "// 태그 이름이 [포함 (텍스트 (), '내용')]")
      5. 组合 定位 find_element_by_xpath ( "// 입력 [클래스 = 's_ipt'및 @ 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