파이썬 + 셀레늄 자동화 코드 테스트 (또한 웹 UI 자동화 또는 자동화)
왜 테스트 자동화?
- 이유
- 해결 회귀 테스트, 스트레스 테스트, 호환성 테스트
- 테스트의 효율성을 개선하고 제품의 품질을 보장
- 관련 설명
- 회귀 테스트 : 새 릴리스 검증하기 전에 기능 프로젝트
- 스트레스 테스트 : 다중 사용자 운영 소프트웨어의 이해 될 수는 핸들 사용자에게 기능은 서버 통계를 요청
- 호환성 테스트 : 다른 브라우저에서 해당 소프트웨어 실행 상태
- 다음 세 가지 조건은 일반적으로 자동화의 사용을 필요로?
- 수요 자주 변경
- 긴 프로젝트주기
- 프로젝트는 회귀 테스트를 필요로
파이썬 설정
-
파일 → 프로젝트 통역 → 기존 통역 → → 선택 설치 위치 선택 파이썬 python.exe를
-
닫기 엄격 모드
-
물결 모양의 선은 악당 PyCharm 인터페이스에서 오른쪽 하단의 메뉴 아이콘을 선택
-
세 가지 설정 항목 없음, 구문, 검사는 위, 제공되는 화살표를 드래그 할 수 있습니다와 인터페이스로 제공되는 물결 모양의 라인에 참조하십시오.
- 아무도에는 물결 모양의 선을 나타냅니다
- 문법 구문 에러 표시 만 물결 선을 나타낸다
- 검사는 구문 오류를 표시 및 사양 PEP8 디스플레이 물결 모양의 라인을 충족하지 않습니다
-
-
포맷 코드 Ctrl + Alt + L
셀레늄 함량
-
요소의 위치 지정
-
ID 포지셔닝 ( "kw") 주 find_element_by_id : 일부 동적 ID 값을 변경
-
class_name에 위치 find_element_by_class_name ( "s_ipt") 참고 : 반복 할 가능성이 클래스 명
-
TAG_NAME 위치 find_element_by_tag_name ( "입력") 주 : 태그 이름은 대부분 반복 될
-
이름 앵커 find_element_by_name ( "WD") 참고 : 이름은 가능성이 반복되는
-
링크 텍스트의 핀 포인트 find_element_by_link_text ( "로그인")
-
퍼지 텍스트 링크가 find_element_by_partial_link_text 위치 ( "보드")
-
CSS 위치
- 이름표 위치 find_element_by_css_selector ( "입력")
- ID 定位 find_element_by_css_selector ( "#의 kw")
- 클래스 定位 find_element_by_css_selector ( ". s_ipt")
- 属性 定位 find_element_by_css_selector find_element_by_css_selector를 ( "[이름 ="WD "]") ( "[최대 길이 = '255']")
- 아들 위치 find_element_by_css_selector ( "SPAN> 입력")
- 组合 定位 右击 - 复制 -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 "]")
-
XPath는 위치를 마우스 오른쪽 버튼으로 클릭 - 복사를 -XPath
- 위치 속성 find_element_by_xpath ( "// 태그 이름 [부동산 @ = '속성']")
- 이름 태그 위치 find_element_by_xpath ( "// 입력")
- 아들 위치 find_element_by_xpath ( "// 스팬 / 입력")
- 요소 컨텐츠 find_element_by_xpath 위치 지정 ( "// 태그 이름이 [포함 (텍스트 (), '내용')]")
- 组合 定位 find_element_by_xpath ( "// 입력 [클래스 = 's_ipt'및 @ NAME ="WD "@]")
-
-
Webdriver 개체 방법
-
browser.save_screenshot ( '.// baidu.png') 스크린 샷
-
스위치 창
""" 浏览器打开两个窗口,每个窗口都有控制句柄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()
-
경고 상자
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()
-
드롭 다운 상자
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()
-
서스펜션 상자
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()
-
숨겨진
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)
-
-
유스 케이스의 전 과정의 일반 매개 변수 (전용 로그인)
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)
-
전체 기능성 테스트 케이스의 변형 버전 (코드의 양을 단축)
# 登录模块 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)
-
보고서를 생성
- 테스트 케이스 파일과 같은 디렉토리에 9run_all_testcases.py 파일을 추가합니다
- 테스트 케이스 파일과 같은 디렉토리에 HTMLTestReport.py 파일을 추가합니다