selenium的简介:
selenium的四大体系:
(1)selenium IDE (可以录制)
(2)selenium WebDriver
(3)selenium Grid (多台机器一起执行,分布式)
(4)selenium Remote Control(RC) 在selenium3.0及以上的版本中已删除该部分
可以录制自动化脚本的工具:Katalon Studio、selenium IDE 录制后可以生成各种语言的脚本代码
1)环境安装:
(1)安装selenium,如果用Pythong开发,最好使用pip install selenium命令来安装,安装之前当然要成功安装好Python
(2)安装浏览器的driver,两种方法:1)下载好各浏览器的driver,安装好以后,设置环境变量 2)安装好driver后,不设置环境变量在脚本中设置如:
self.driver=webdriver.Chrome(executable_path='page_object/driver/chromedriver.exe')
(3)启动特定版本的
options=webdriver.ChromeOptions()
options.binary_location="chrome path"
self.driver=webdriver.Chrome(options=options)
2)元素定位:(web测试尽量使用css定位,利用父子关系,组合css等)
chrome的定位技巧,在console下可以执行两个特别 的函数
$x('xpath表达式')
eg: 1) $x("//*[contains(text(),'MTSC2020')]")
$('css表达式')
eg: 1)$('.toc-container .btn.btn-default') 说明:(.)表示class属性,空格表示class是父子关系,两个点表示两个class
2)css定位+额外属性:
js定位:
document.getElementsByClassName("btn-default")
document.getElementById("main-navbar-collapse")
3)selenium中基本的api
forward
max
fullscreen
cookie
switch
execute_script:(不要忘记加return)
def test_excute_script(self):
raw=self.driver.execute_script("return JSON.stringify(window.performance.timing)") #打印出时间戳,比requests更详细,可以获取requests无法得到的一些内部时间,这个追踪整个浏览器内部的时间
print(raw)
print(json.loads(raw))
print(json.dumps(json.loads(raw)))
execute:
def test_execute(self):#调用新的api
self.driver.execute("getXXX",params={"x":1,"y":2})
4)selenium的几种启动模式:
(1)本地模式(传统模式)webdriver.Chrome
python testecase->chromedriver(本地有chromedriver)->启动chrome
代码实现:
self.driver=webdriver.Chrome("F:\\work\\xueqiu_app\\web\\tools\\chromedriver.exe")
self.driver=webdriver.Chrome() #把chromedriver配置到环境变量中
(2)远程模式(Remote)
python testcase->远程selenium server->调用chromedriver/iedriver/->启动chrome/ie
代码实现
1、启动selenium server(远程模式需要启动selenium-server-standation-3.141.59.jar这个jar包):
java -jar selenium-server-standation-3.141.59.jar -debug
2、代码实现:(#没有执行成功)
self.driver=webdriver.Remote(desired_capabilities=DesiredCapabilities.CHROME)
self.driver.implicitly_wait(10)
self.driver.get('https://testerhome.com/')
(3)grid模式
python testcase->grid hub/类似STF->grid node->selenium server->chromedriver/iedriver->chrome/ie
5)获取cookie
def test_cookie(self):
self.driver.get("https://testerhome.com/")
print(self.driver.get_cookies()) #原始的cookie
self.driver.add_cookie({"name":"a","value":"b"})
self.driver.add_cookie({"name": "name", "value": "name demo"})
print(self.driver.get_cookies()) #添加了值以后的cookie
追加cookie后的效果:
6)使用remote webdriver时报错:polling启动不起来,是因为Java1.8的一个bug,解决办法升级java1.8
7)雪球web搜索alibaba,添加股票:
Basepage.py
#Basepage.py
from selenium.webdriver.remote.webdriver import WebDriver
class BasePage(object):
def __init__(self,driver):
self.driver:WebDriver=driver
MainPage.py
#MainPage.py 导入的是类不是文件
from web.page_object.Basepage import BasePage
from web.page_object.SearchPage import SearchPage
from time import sleep
class MainPage(BasePage):
def search(self,keyword):
self.driver.find_element_by_name("q").send_keys(keyword)
self.driver.find_element_by_css_selector(".Header_nav__search_1YZ button").click()#注意这个搜索框在不同页面定位不同
return SearchPage(self.driver) #传递driver
SearchPage.py
from web.page_object.Basepage import BasePage
class SearchPage(BasePage):
def follow(self,keyword):
self.driver.find_element_by_xpath('//*[contains(text(),"%s")]/../../../..//*[@class="follow__control"]' %keyword).click()
return self
测试用例:
from time import sleep
from selenium import webdriver
from web.page_object.MainPage import MainPage
class Testxueqiuweb(object):
def setup(self):
self.driver=webdriver.Chrome('F:\\work\\TPS_automation\\driver\\chromedriver.exe')
self.driver.maximize_window()
self.driver.implicitly_wait(10)
self.driver.get('https://xueqiu.com/')
self.main=MainPage(self.driver)
def test_search(self):
self.main.search('alibaba').follow('BABA')
def teardown(self):
sleep(60)
self.driver.quit()
9)登录和注册的问题
登录验证码问题解决办法:
(1)验证码ocr可行,但是不稳定,而且不是正确的方向
(2)提高可测性 ,使用万能验证友,需要研发配合
(3)绕过登录直接使用cookie,就可以只需要登录一次,每次自动化都可以复用,一直持续到你退出登录cookie失效,一般是1个月才会变一次
(4)使用微博、QQ等第三方登录(一般没有验证码)
注册问题:
注册最大的难点不是自动化,其实在数据准备
使用mock中心,解除数据依赖
不断注册新用户,借助于运营部门批量删除测试账号
完全使用测试环境,在测试环境中提供删除用户的相关接口
(3)绕过登录直接使用cookie的实现方法:
def test_profile(self):
print(self.driver.get_cookies())
self.driver.add_cookie({"name":"device_id","value":"24700f9f1986800ab4fcc880530dd0ed"})
self.driver.add_cookie({"name": "u", "value": "291568878545474"}) #把cookie中的内容都放在里面
self.driver.add_cookie({"name": "", "value": ""})
self.driver.add_cookie({"name": "", "value": ""})
self.driver.add_cookie({"name": "", "value": ""})
print(self.driver.get_cookies())
self.driver.refresh()
self.driver.get('https://xueqiu.com/setting/user')
上面代码中cookie的来源:选中一个请示在console中输入document.cookie,不过这样只会显示一部分cookie不会显示全部的cookie
上图中cookie并不全,用下面的方法取cookie:
上面这样取出的cookie并不全,可以到个人设置页面中找到:
把上面这些cookie是通过第三方:QQ登陆后到个人设置页面看到的,把这些cookie增加到脚本中去就能绕开登陆:
10)脚本中打印日志: