selenium自动化测试-登录网站用户
昨天学习了selenium自动化测试工具的入门,知道了Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等。
今天学习通过selenium自动化测试工具自动登录某网站用户操作。
第一步:确定目标网址
比如:天天基金网站登录页面"https://login.1234567.com.cn/login"
第二步:确定登录表单元素位置
通过谷歌浏览器F12调试功能可以很快的定位页面元素位置,这也是开发常用谷歌浏览器的原因吧!
比如:用户账号输入框位置
通过 F12 调试确定元素位置,然后右键--》Copy--》Copy XPath: 获得账号输入框位置: //*[@id="tbname"]
在后面写代码操作该元素使用该方法即可: driver.find_element(By.ID, "tbname")
依次类推,获取密码,记住交易账号单选框,已阅读单选框,登录按钮等等表单元素位置。
第三步:编写代码
采用拆分步骤细化功能模块封装方法编写代码,便于后续扩展功能模块。
ttjj_webdriver.py:
# -*- coding: UTF-8 -*- # selenium 自动化测试工具 import time import random from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By # 打开驱动 def open_driver(): try: # 连接浏览器web驱动全局变量 global driver # Linux系统下浏览器驱动无界面显示,需要设置参数 # “–no-sandbox”参数是让Chrome在root权限下跑 # “–headless”参数是不用打开图形界面 ''' chrome_options = Options() # 设为无头模式 chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--disable-dev-shm-usage') # 连接Chrome浏览器驱动,获取驱动 driver = webdriver.Chrome(chrome_options=chrome_options) ''' # 此步骤很重要,设置chrome为开发者模式,防止被各大网站识别出来使用了Selenium options = Options() # 去掉提示:Chrome正收到自动测试软件的控制 # options.add_argument('disable-infobars') # 以键值对的形式加入参数,打开浏览器开发者模式 # options.add_experimental_option('excludeSwitches', ['enable-automation']) # 打开浏览器开发者模式 # options.add_argument("--auto-open-devtools-for-tabs") driver = webdriver.Chrome(chrome_options=options) # driver = webdriver.Chrome() print('连接Chrome浏览器驱动') # 浏览器窗口最大化 driver.maximize_window() ''' 1, 隐式等待方法 driver.implicitly_wait(最大等待时间, 单位: 秒) 2, 隐式等待作用 在规定的时间内等待页面所有元素加载; 3,使用场景: 在有页面跳转的时候, 可以使用隐式等待。 ''' driver.implicitly_wait(3) # 强制等待,随机休眠 暂停0-3秒的整数秒,时间区间:[0,3] time.sleep(random.randint(0, 3)) except Exception as e: driver = None print(str(e)) # 关闭驱动 def close_driver(): driver.quit() print('关闭Chrome浏览器驱动') # 检查元素是否存在 def check_element_exists(condition, element): ''' @方法名称: 校验判断网页元素是否存在 @中文注释: 校验判断网页元素是否存在 @入参: @param condition str 网页元素定位条件 @param element str 网页元素定位坐标 @出参: @返回状态: @return 0 失败 @return 1 成功 @return 2 异常 @返回错误码 @返回错误信息 @作 者: PandaCode辉 @创建时间: 2023-09-21 @使用范例: check_element_exists('id', 'username') ''' try: if (not type(condition) is str): print('条件参数错误,不是字符串:' + element) return [0, "111111", "条件参数错误,不是字符串", [None]] if (not type(element) is str): print('元素参数错误,不是字符串:' + element) return [0, "111112", "元素参数错误,不是字符串", [None]] # 根据条件定位元素 if condition == 'class': driver.find_element(By.CLASS_NAME, element) elif condition == 'id': driver.find_element(By.ID, element) elif condition == 'xpath': driver.find_element(By.XPATH, element) return [1, '000000', "判断网页元素成功", [None]] except Exception as e: return [0, '999999', "判断网页元素是否存在异常," + str(e), [None]] def pc_ttjj_login(username, password): ''' @方法名称: 登录天天基金用户 @中文注释: 登录天天基金用户 @入参: @param username str 登录用户 @param password str 登录密码 @出参: @返回状态: @return 0 失败或异常 @return 1 成功 @返回错误码 @返回错误信息 @作 者: PandaCode辉 @创建时间: 2023-09-21 @使用范例: ['user123','pwd123'] ''' try: if (not type(username) is str): return [0, "111111", "登录用户参数类型错误,不为字符串", [None]] if (not type(password) is str): return [0, "111112", "登录密码参数类型错误,不为字符串", [None]] print('开始打开Chrome浏览器驱动') open_driver() print('随机休眠') # 随机休眠 暂停0-2秒的整数秒 time.sleep(random.randint(0, 2)) print('username:' + username + '/password:' + password) # 登录时请求的url login_url = 'https://login.1234567.com.cn/login' driver.get(login_url) print('随机休眠') # 随机休眠 暂停0-2秒的整数秒 time.sleep(random.randint(0, 2)) # 清空登录框 # 通过webdriver对象的find_element_by_xx(" "),在selenium的4.0版本中此种用法已经抛弃。 # driver.find_element_by_xpath("./*//input[@id='tbname']").clear() ''' 通过webdriver模块中的By,以指定方式定位元素 导入模块:from selenium.webdriver.common.by import By driver.find_element(By.ID,"username") driver.find_element(By.CLASS_NAME,"passwors") driver.find_element(By.TAG_NAME,"imput" ''' driver.find_element(By.ID, "tbname").clear() print('输入用户名') # 自动填入登录用户名 # driver.find_element_by_xpath("./*//input[@id='tbname']").send_keys(username) driver.find_element(By.ID, "tbname").send_keys(username) print('随机休眠') # 随机休眠 暂停0-2秒的整数秒 time.sleep(random.randint(0, 2)) # 清空密码框 driver.find_element(By.ID, "tbpwd").clear() print('输入密码') # 自动填入登录密码 driver.find_element(By.ID, "tbpwd").send_keys(password) print('随机休眠') # 随机休眠 暂停0-2秒的整数秒 time.sleep(random.randint(0, 2)) # 点击#记住交易帐号 driver.find_element(By.ID, "tbcook").click() print('点击记住交易帐号') # 点击#同意服务协议 driver.find_element(By.ID, "protocolCheckbox").click() print('点击同意服务协议') # 点击登录按钮进行登录 driver.find_element(By.ID, "btn_login").click() print('点击登录按钮') # 等待3秒启动完成 driver.implicitly_wait(3) time.sleep(3) print('随机休眠') # 随机休眠 暂停0-2秒的整数秒 time.sleep(random.randint(0, 2)) # 检查元素是否存在,查看持仓明细元素,用来判断是否登录成功 check_rsp = check_element_exists('id', "myassets_hold") if check_rsp[0] == 1: print("登录成功") print('开始关闭Chrome浏览器驱动') close_driver() # 返回容器 return [1, '000000', "登录成功", [None]] else: return check_rsp except Exception as e: print("登录账户异常," + str(e)) print('开始关闭Chrome浏览器驱动') close_driver() return [0, '999999', "登录账户异常," + str(e), [None]] # 主方法 if __name__ == '__main__': username = "123456789" password = "password123" # 登录用户 rst = pc_ttjj_login(username, password)
第四步:运行测试效果
-------------------------------------------end---------------------------------------