Selenium相关习题
任务1:打开百度,搜索“地球”
启动Chrome,打开https://www.baidu.com。
用 find_element 定位到搜索框(ID或Name),输入“地球”。
定位“百度一下”按钮,点击。
driver = webdriver.Chrome(service=Service('./chromedriver.exe')) driver.get('https://www.baidu.com') wait = WebDriverWait(driver, 10) wait.until(EC.element_to_be_clickable((By.ID, 'chat-textarea'))).send_keys('地球') driver.find_element(By.ID, 'chat-submit-button').click() input('按任意键继续...')任务2:登录一个测试网站(45分钟)
推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)。
定位用户名框、密码框、登录按钮,执行登录。
登录成功后,找到页面上的“Log out”按钮或某个成功提示文本,打印出来。
在这里你会遇到等待的痛点:登录按钮点了之后,页面会跳转,如果你不等,下一个元素就找不到。试着用显式等待解决。
driver = webdriver.Chrome(service=Service('./chromedriver.exe')) driver.get('https://practicetestautomation.com/practice-test-login/') driver.find_element(By.ID, 'username').send_keys('student') driver.find_element(By.ID, 'password').send_keys('Password123') driver.find_element(By.ID, 'submit').click() wait = WebDriverWait(driver, 10) text = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a'))).text print(text) input('按任意键继续...')任务3:带数据驱动的登录测试(升级,90分钟)
推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)
。
创建一个CSV或Excel文件,里面有多组用户名和密码(包括正确的和错误的)。
写一个循环,从文件里读取每组数据,执行登录,然后根据预期结果(成功或失败)判断测试是否通过,并用Python的print输出结果。
这是你简历上第一个“自动化测试框架”的雏形,非常重要。
表格数据:
def get_data_from_excel(file_path): wb = openpyxl.load_workbook(file_path) sheet = wb.active data = [] for row in sheet.iter_rows(min_row=2, values_only=True): data.append(row) return data def test_login(username, password): WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys(username) driver.find_element(By.ID, 'password').send_keys(password) driver.find_element(By.ID, 'submit').click() try: WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a'))) except TimeoutException: return False else: return True driver = webdriver.Chrome(service=Service('./chromedriver.exe')) driver.get('https://practicetestautomation.com/practice-test-login/') data = get_data_from_excel('./testdata.xlsx') for username, password in data: login_success = test_login(username, password) if login_success: driver.back() print(f"username = {username},password = {password}登录成功") else: print(f"username = {username},password = {password}登录失败") input('按任意键继续...')任务4(选做,进阶):使用Page Object模式重构
把任务3转换成Page Object 设计模式。很简单,就是把“一个页面的所有元素定位和操作”封装成一个类,
测试脚本只调用类的方法,看起来特别清晰易维护。
这个模式你只要在面试中能讲出它的好处,就能秒杀很多竞争者:
好维护:页面元素变了,只用改对应的页面对象类,不用改所有测试用例 。
能复用:同一个页面的操作方法可以被多个测试用例重复调用,减少重复代码 。
看得懂:测试用例里全是业务语言,不像以前那样夹杂大量技术代码,逻辑更清晰
class PageLogin: #页面网址 URL = 'https://practicetestautomation.com/practice-test-login/' #元素定位器 USERNAME_INPUT = (By.ID, 'username') PASSWORD_INPUT = (By.ID, 'password') LOGIN_CLICK = (By.ID, 'submit') SUCCESS_FLAG = (By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a') #初始化driver def __init__(self, driver): self.driver = driver #进入网站 def open(self): self.driver.get(self.URL) #输入账户 def username_enter(self, username): WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.USERNAME_INPUT)).send_keys(username) #输入密码 def password_enter(self, password): self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password) #点击登录按钮 def login_click(self): self.driver.find_element(*self.LOGIN_CLICK).click() #登录 def test_login(self,username, password): self.username_enter(username) self.password_enter(password) self.login_click() try: WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.SUCCESS_FLAG)) except TimeoutException: return False else: return True def get_data_from_excel(file_path): wb = openpyxl.load_workbook(file_path) sheet = wb.active data = [] for row in sheet.iter_rows(min_row=2, values_only=True): data.append(row) return data driver = webdriver.Chrome(service=Service('./chromedriver.exe')) pagelogin = PageLogin(driver) pagelogin.open() data = get_data_from_excel('testdata.xlsx') for username, password in data: result = pagelogin.test_login(username, password) if result: driver.back() print(f"username = {username},password = {password}登录成功") else: print(f"username = {username},password = {password}登录失败") input('按任意键继续...')