前提:创建一个text文件,用于存储用户名和密码,再用代码去调用文件

, root, ,122 root,123 yohonormal,123456
此文件中包含了 用户名和密码都为空、密码为空、用户名为空、密码错误、用户名和密码都正确 的情况
1、打算把文件查看也封装成一个方法,发现没办法把登录加进去,写了一个半成品,还没搞好

from selenium import webdriver from time import sleep un = '' pw = '' # 打开谷歌浏览器 browser = webdriver.Chrome(r'/Users/chensihan/Downloads/chromedriver') # 最大化浏览器 browser.maximize_window() # 打开公司内部网站 browser.get("https://testsmallsystem.yoho8.com/login") # 给1秒钟去打开页面,没打开页面就去做其他操作,会报错 sleep(1) # 获取文件数据 def file(): # 将un,pw作为全部变量,在此函数中赋值后,在其他函数中可使用这个值,否则使用的是初始化的值 global un, pw, msg_line # 打开文件,读取用户名 msg = open('/Users/chensihan/Desktop/用户名和密码.txt', 'r') # 循环获取每行内容 for line in msg: # 使用split按空格分割字符,并且用strip去除掉两边的空格,得到了一个列表msg_line, # msg_line的第0个元素就是文件第一行的用户名,msg_line的第1个元素就是文件第一行的密码 msg_line = line.strip().split() # 将msg_line的第0个元素赋值给un,用于登录函数中输入用户名 un = msg_line[0] # 将msg_line的第1个元素赋值给pw,用于登录函数中输入密码 pw = msg_line[1] msg.close() # 登录 def login(): # 通过xpath定位用户名输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').clear() # 输入用户名 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').send_keys(un) # 通过xpath定位密码输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').clear() # 输入密码 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').send_keys(pw) sleep(1) # 登录 browser.find_element_by_class_name('_1dNJXuqS50-Y8IDzBbpxeR').click() # 给网页2秒加载时间 sleep(2) # 退出当前账户 def quit(): browser.find_element_by_class_name('_1ECz20e4Sb4cz8jt2QRoBL').click() sleep(2) # file() # login() # quit() def start(): while 1: file() if msg_line != []: login() quit() else: print('执行完毕!!!') break start() # # # 截取当前页面 # browser.save_screenshot("/Applications/Google Chrome.app/p.png") # # 定位验证码 # yzm = browser.find_element_by_id('randImage') # # location = yzm.location # size = yzm.size # rangle = (int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height'])) # # i = Image.open('/Applications/Google Chrome.app/p.png') # frame4 = i.crop(rangle) # frame4.save('/Applications/Google Chrome.app/frame4.png') # dym = Image.open('/Applications/Google Chrome.app/frame4.png') # text = pytesseract.image_to_string(dym) # browser.find_element_by_name('code').send_keys(text) # browser.find_elements_by_class_name('btn').click() 未完成的循环,可以不看
2、除文件外,其余都封装成了方法

from selenium import webdriver from time import sleep un = '' pw = '' # 打开谷歌浏览器 browser = webdriver.Chrome(r'/Users/chensihan/Downloads/chromedriver') # 最大化浏览器 browser.maximize_window() # 打开公司内部网站 browser.get("https://testsmallsystem.yoho8.com/login") # 给1秒钟去打开页面,没打开页面就去做其他操作,会报错 sleep(1) # 登录 def login(): # 通过xpath定位用户名输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').clear() # 输入用户名 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').send_keys(un) # 通过xpath定位密码输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').clear() # 输入密码 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').send_keys(pw) sleep(1) # 登录 browser.find_element_by_class_name('_1dNJXuqS50-Y8IDzBbpxeR').click() # 给网页2秒加载时间 sleep(2) # 退出当前账户 def quit(): browser.find_element_by_class_name('_1ECz20e4Sb4cz8jt2QRoBL').click() sleep(2) # 打开文件,读取用户名 msg = open('/Users/chensihan/Downloads/老男孩/selenium测试/0测试用的用户名和密码', 'r') # 循环获取每行内容 for line in msg: # 使用split按空格分割字符,并且用strip去除掉两边的空格,得到了一个列表msg_line, # msg_line的第0个元素就是文件第一行的用户名,msg_line的第1个元素就是文件第一行的密码 msg_line = line.strip().split() # 将msg_line的第0个元素赋值给un,用于登录函数中输入用户名 un = msg_line[0] # 将msg_line的第1个元素赋值给pw,用于登录函数中输入密码 pw = msg_line[1] # 容错处理 # 正确的执行登录和退出 # 关闭浏览器 browser.quit()
3、上边的代码只有正确账号登录,没有兼容错误的账号,本版本加了空账号、缺失用户名或密码的

from selenium import webdriver from time import sleep un = '' pw = '' # 打开谷歌浏览器 browser = webdriver.Chrome(r'/Users/chensihan/Downloads/chromedriver') # 最大化浏览器 browser.maximize_window() # 打开公司内部网站 browser.get("https://testsmallsystem.yoho8.com/login") # 给1秒钟去打开页面,没打开页面就去做其他操作,会报错 sleep(1) # 登录 def login(): # 通过xpath定位用户名输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').clear() # 输入用户名 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').send_keys(un) # 通过xpath定位密码输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').clear() # 输入密码 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').send_keys(pw) sleep(1) # 登录 browser.find_element_by_class_name('_1dNJXuqS50-Y8IDzBbpxeR').click() # 给网页2秒加载时间 sleep(2) # 退出当前账户 def quit(): browser.find_element_by_class_name('_1ECz20e4Sb4cz8jt2QRoBL').click() sleep(2) # 打开文件,读取用户名 msg = open('/Users/chensihan/Downloads/老男孩/selenium测试/0测试用的用户名和密码', 'r') # 循环获取每行内容 for line in msg: # 使用split按空格分割字符,并且用strip去除掉两边的空格,得到了一个列表msg_line, # msg_line的第0个元素就是文件第一行的用户名,msg_line的第1个元素就是文件第一行的密码 msg_line = line.strip().split(',') # 判断是否输入为空,如果获取当前行的元素为0个 if len(msg_line) == 0: un = '' pw = '' else: # 将msg_line的第0个元素赋值给un,用于登录函数中输入用户名 un = msg_line[0] # 将msg_line的第1个元素赋值给pw,用于登录函数中输入密码 pw = msg_line[1] # 容错处理 # 正确的执行登录和退出 try: login() quit() # 错误的跳出当前循环 except: continue # 关闭浏览器 browser.quit() 加了错误处理
4、代码可执行了,接下来就是把测试结果保存到文件,测试结果,就是发送登录请求后,接口返回的数据,以及当前请求接口时使用的用户名和密码

from selenium import webdriver from time import sleep import requests import json un = '' pw = '' # 打开谷歌浏览器 browser = webdriver.Chrome(r'/Users/chensihan/Downloads/chromedriver') # 最大化浏览器 browser.maximize_window() # 打开公司内部网站 browser.get("https://testsmallsystem.yoho8.com/login_file") # 给1秒钟去打开页面,没打开页面就去做其他操作,会报错 sleep(1) # 登录 def login(): # 通过xpath定位用户名输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').clear() # 输入用户名 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').send_keys(un) # 通过xpath定位密码输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').clear() # 输入密码 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').send_keys(pw) sleep(1) # 登录 browser.find_element_by_class_name('_1dNJXuqS50-Y8IDzBbpxeR').click() # 给网页2秒加载时间 sleep(2) # 获取登录后登录接口的数据 def request_url(): # 接口地址 url = 'https://testm.yoho8.com/apiauth/login/login' # 请求头 headers = { "Content-Type": "application/json", } # 请求体。因为是先执行的登录,所以使用当前登录的用户名和密码来请求这个接口 data = { "userName": un, "password": pw, } # 获取请求之后的返回信息 response = requests.post(url=url, data=json.dumps(data), headers=headers) print(response.text) # 将获取的返回信息保存到文件中,并换行 with open('测试结果', 'a') as fp: fp.write('用户名:' + un + ' ' + '密码:' + pw + ' ' + '登录结果:' + response.text + '\n') print('获取成功!') # 退出当前账户 def quit(): browser.find_element_by_class_name('_1ECz20e4Sb4cz8jt2QRoBL').click() sleep(2) # 打开文件,读取用户名 msg = open('/Users/chensihan/Downloads/老男孩/selenium测试/login_file/0测试用的用户名和密码', 'r') # 循环获取每行内容 for line in msg: # 使用split按空格分割字符,并且用strip去除掉两边的空格,得到了一个列表msg_line, # msg_line的第0个元素就是文件第一行的用户名,msg_line的第1个元素就是文件第一行的密码 msg_line = line.strip().split(',') # 判断是否输入为空,如果获取当前行的元素为0个,则用户名和密码都为空 if len(msg_line) == 0: un = '' pw = '' else: # 将msg_line的第0个元素赋值给un,用于登录函数中输入用户名 un = msg_line[0] # 将msg_line的第1个元素赋值给pw,用于登录函数中输入密码 pw = msg_line[1] # 容错处理 # 正确的执行登录和退出 try: login() request_url() quit() # 错误的跳出当前循环 except: continue # 关闭浏览器 browser.quit() 输出测试结果并保存文件
5、分析测试结果
通过结果中的errcode,筛选出errcode非0(即登录不成功的状态)的所有数据,将登录的用户名和密码以及请求结果保存到新文件中
并且加了一行 “ if __name__ == '__main__': ” ,方便其他文件import此文件时,此文件内部的内容不会被执行

from selenium import webdriver from time import sleep import requests import json un = '' pw = '' # 打开谷歌浏览器 browser = webdriver.Chrome(r'/Users/chensihan/Downloads/chromedriver') # 最大化浏览器 browser.maximize_window() # 打开公司内部网站 browser.get("https://testsmallsystem.yoho8.com/login_file") # 给1秒钟去打开页面,没打开页面就去做其他操作,会报错 sleep(1) # 登录 def login(): # 通过xpath定位用户名输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').clear() # 输入用户名 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[1]/input').send_keys(un) # 通过xpath定位密码输入框,并清空输入框 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').clear() # 输入密码 browser.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/input').send_keys(pw) sleep(1) # 登录 browser.find_element_by_class_name('_1dNJXuqS50-Y8IDzBbpxeR').click() # 给网页2秒加载时间 sleep(2) # 获取登录后登录接口的数据 def request_url(): # 接口地址 url = 'https://testm.yoho8.com/apiauth/login/login' # 请求头 headers = { "Content-Type": "application/json", } # 请求体。因为是先执行的登录,所以使用当前登录的用户名和密码来请求这个接口 data = { "userName": un, "password": pw, } # 获取请求之后的返回信息 response = requests.post(url=url, data=json.dumps(data), headers=headers) # print(response.text) # 将获取的返回信息保存到文件中,并换行 with open('测试结果', 'a') as fp: fp.write('用户名:' + un + ' ' + '密码:' + pw + ' ' + '登录结果:' + response.text + '\n') # print('获取成功!') # 退出当前账户 def quit(): browser.find_element_by_class_name('_1ECz20e4Sb4cz8jt2QRoBL').click() sleep(2) # 分析测试结果 def test_result(): msg_dict = {} with open('测试结果', 'r') as fp: msg = fp.readlines() for line in msg: msg_line = line.strip().split() for i in msg_line: i1 = i.strip().split(',', 0) for i in i1: i2 = i1[0].split(':', 1) msg_dict[i2[0]] = i2[1] msg_dict['登录结果'] = eval(msg_dict['登录结果']) if msg_dict['登录结果']['errCode'] != 0: with open('测试结果分析', 'a') as fp1: fp1.write(str(msg_dict) + '\n') print('分析完毕!') # 只在本文件中执行,被import的时候,不会执行整个程序 if __name__ == '__main__': # 打开文件,读取用户名 msg = open('/Users/chensihan/Downloads/老男孩/selenium测试/login_file/0测试用的用户名和密码', 'r') # 循环获取每行内容 for line in msg: # 使用split按空格分割字符,并且用strip去除掉两边的空格,得到了一个列表msg_line, # msg_line的第0个元素就是文件第一行的用户名,msg_line的第1个元素就是文件第一行的密码 msg_line = line.strip().split(',') # 判断是否输入为空,如果获取当前行的元素为0个,则用户名和密码都为空 if len(msg_line) == 0: un = '' pw = '' else: # 将msg_line的第0个元素赋值给un,用于登录函数中输入用户名 un = msg_line[0] # 将msg_line的第1个元素赋值给pw,用于登录函数中输入密码 pw = msg_line[1] # 容错处理 # 正确的执行登录和退出 try: login() request_url() quit() # 错误的跳出当前循环 except: continue test_result() # 关闭浏览器 browser.quit() 分析测试结果