Selenium应用
一. Selenium背景与概念
Selenium是一个Web应用程序测试工具。Selenium测试直接运行在浏览器中,支持.Net、Java、Perl、Python等不同语言的测试脚本。
因为各大应用平台没有对应的服务发布接口,sdk也没有覆盖相应的功能,所以此处转换了一种思路,使用Selenium操作各应用平台的web页面间接实现app发布的功能。各大应用商像 “360开放平台”,“腾讯应用宝”,“VIVO应用商店”,“OPPO软件商店”,“百度开放平台”,“小米”,“华为”,“魅族”,"阿里应用分发开放平台"等,此处以腾讯应用平台为示例,实现app发布功能
二. Selenium组成
- Selenium Hub :也叫做 Selenium Server,用来接收服务请求,并将收到的请求转发给相应的node执行测试请求。
- Selenium Node :Selenium任务执行的主体,用来接收Server发过来的任务,并调用相应的浏览器执行测试请求。
- Python test :编写任务,并将任务发送给 Selenium Hub。
三. Selenium搭建
1. java环境准备,此处不做详解,Hub/node都需要。
2. Selenium Hub搭建
- 下载 selenium-server-standalone jar 包:/data/sel/selenium-server-standalone-2.42.2.jar
- 准备 selenium配置文件 /data/sel/config.json
{ "host": null, "port": 4444, "prioritizer": null, "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher", "throwOnCapabilityNotPresent": true, "newSessionWaitTimeout": -1, "jettyMaxThreads": -1, "nodePolling": 5000, "cleanUpCycle": 5000, "timeout": 30000, "browserTimeout": 0, "maxSession": 5, "unregisterIfStillDownAfter": 30000 } - 启动 Selenium Hub服务
#] java -jar /data/sel/selenium-server-standalone-2.42.2.jar -role hub -hubConfig /data/sel/config.json Sep 29, 2020 5:07:15 PM org.openqa.grid.selenium.GridLauncher main INFO: Launching a selenium grid server 2020-09-29 17:07:16.404:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT 2020-09-29 17:07:16.427:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null} 2020-09-29 17:07:16.435:INFO:osjs.AbstractConnector:Started SocketConnector@0.0.0.0:4444有监听端口提示后,代表 Selenium Hub服务端搭建启动完成
3. Selenium Node搭建
-
下载 selenium-server-standalone jar 包:D:\apps\selenium-server-standalone-2.42.2.jar
-
安装谷歌浏览器
-
安装 chromedriver.exe 谷歌浏览器驱动:D:\apps\chromedriver.exe
-
准备 selenium配置文件 D:\apps\config.json
{ "capabilities": [ { "browserName": "*googlechrome", "maxInstances": 1, "seleniumProtocol": "Selenium" }, { "browserName": "chrome", "maxInstances": 1, "seleniumProtocol": "WebDriver" } ], "configuration": { "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "maxSession": 1, "port": 5555, "register": true, "registerCycle": 5000 } } -
打开cmd,启动 Selenium Node服务
java -Dwebdriver.chrome.driver=D:\apps\chromedriver.exe -jar D:\apps\selenium-server-tandalone-2.42.2.jar -nole node -host 本机地址 -hub http://HUB地址:4444/grid/register -nodeConfig D:\apps\config.json 9月 29, 2020 5:14:34 下午 org.openqa.grid.selenium.GridLauncher main 信息: Launching a selenium grid node 17:14:35.101 INFO - Java: Oracle Corporation 15+36-1562 17:14:35.101 INFO - OS: Windows 10 10.0 amd64 17:14:35.105 INFO - v2.42.2, with Core v2.42.2. Built from revision 6a6995d 17:14:35.144 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:5555/wd/hub 17:14:35.145 INFO - Version Jetty/5.1.x 17:14:35.145 INFO - Started HttpContext[/selenium-server,/selenium-server] 17:14:35.175 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@71c3b41 17:14:35.175 INFO - Started HttpContext[/wd,/wd] 17:14:35.176 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver] 17:14:35.176 INFO - Started HttpContext[/,/] 17:14:35.177 INFO - Started SocketListener on 0.0.0.0:5555 17:14:35.177 INFO - Started org.openqa.jetty.jetty.Server@3ce1e309 17:14:35.178 INFO - using the json request : {"capabilities":[{"seleniumProtocol":"Selenium","browserName":"*googlechrome","maxInstances":1,"platform":"XP"},{"seleniumProtocol":"WebDriver","browserName":"chrome","maxInstances":1,"platform":"XP"}],"configuration":{"role":"node","remoteHost":"http://192.168.89.1:5555","hubHost":"192.168.89.133","hubPort":4444,"nodeConfig":"D:\\apps\\config.json","url":"http://192.168.89.1:5555","proxy":"org.openqa.grid.selenium.proxy.DefaultRemoteProxy","hub":"http://192.168.89.133:4444/grid/register","port":5555,"host":"192.168.89.1","maxSession":1,"registerCycle":5000,"register":true},"class":"org.openqa.grid.common.RegistrationRequest"} 17:14:35.178 INFO - Starting auto register thread. Will try to register every 5000 ms. 17:14:35.178 INFO - Registering the node to hub :http://hub地址:4444/grid/register有这样的提示,代表Selenium node启动成功。
注意 :node与hub直接网络互通,如果无法访问,则不能连接
4. Python 任务编写运行
- 安装selenium
#] pip3 install selenium - 编写python脚本 qqplatform.py
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.by import By import time class QQPlatform(): def __init__(self): self.url = "https://open.qq.com/login" self.username = "username" self.password = "password" self.hub = 'hub地址' self.browser = webdriver.Remote( command_executor='http://%s:4444/wd/hub'%(self.hub), desired_capabilities=DesiredCapabilities.CHROME) self.browser.maximize_window() def login(self): print("开始登录") self.browser.get(self.url) time.sleep(0.2) self.browser.implicitly_wait(30) self.browser.switch_to.frame('login_frame') self.browser.find_element_by_id("switcher_plogin").click() time.sleep(0.2) self.browser.find_element_by_id("u").send_keys(self.username) self.browser.find_element_by_id("p").send_keys(self.password) time.sleep(0.2) self.browser.find_element_by_id("login_button").click() WebDriverWait(self.browser,15).until(lambda the_driver: the_driver.find_element_by_id('_leftSidebar').is_displayed()) print("登录成功") def upload(self,apk): # 新功能 print("开始上传") apkName=apk.split('/')[-1] handle = self.browser.current_window_handle self.browser.find_element_by_class_name('cover').click() self.browser.find_element_by_partial_link_text('更新安装包').click() print(self.browser.current_url) handles=self.browser.window_handles for newhandle in handles: if newhandle != handle: self.browser.switch_to.window(newhandle) print(self.browser.current_url) try: self.browser.find_element_by_class_name("webuploader-element-invisible").send_keys(apk) self.browser.implicitly_wait(20) except: print("软件包上传失败") exit(2) # 下一步: 待优化 time.sleep(30) # verifyTextPresent(pattern):校验当前页面是否出现该文字 # WebDriverWait(self.browser, 30).until( # lambda the_driver: the_driver.find_element(By.XPATH, '//p[text()="%s")]'%(apkName)).is_displayed()) print("软件包上传成功") def submit(self,isTest): print("开始发布") self.browser.find_element_by_id('j-submit-btn').click() time.sleep(3) if isTest: # 测试打开 self.browser.find_element_by_class_name('j-confirm-no').click() else: # 正式使用打开 self.browser.find_element_by_id('j-confirm-yes').click() time.sleep(1) print("软件包已发布") def close(self): time.sleep(2) print("退出浏览器") time.sleep(2) self.browser.quit() print("应用发布结束") if __name__ == '__main__': apk="/data/apks/_V_2.0.7_300_2020-09-27.apk" isTest=True qq = QQPlatform() qq.login() qq.upload(apk=apk) qq.submit(isTest=isTest) qq.close() - 运行python脚本
#] python3 qqplatform.py
本文介绍Selenium自动化测试工具的应用背景及组成,详细讲解了Selenium环境的搭建过程,包括Java环境准备、SeleniumHub和Node的搭建配置。此外,还提供了Python脚本示例,演示如何通过Selenium实现APP在腾讯应用平台的自动化发布。


被折叠的 条评论
为什么被折叠?



