一、Selenium+Python环境搭建及配置
1.1 selenium 介绍
selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 QTP 有诸多有点:
免费,也不用再为破解 QTP 而大伤脑筋小巧,对于不同的语言它只是一个包而已,而 QTP 需要下载安装1个多 G 的程序。这也是最重要的一点,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通过 selenium 完成自动化测试,而 QTP 只支持 VBS支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器的执行,相当于分发机的功能。1.2 selenium+Python环境配置
前提条件:已安装好Python开发环境(推荐安装Python3.5及以上版本)
安装步骤:
安装selenium
Win:pip install selenium
Mac: pip3 install selenium
安装webdriver
注:webdriver需要和对应的浏览器版本以及selenium版本对应webdriver安装路径
Win:复制webdriver到Python安装目录下
Mac:复制webdriver到/usr/local/bin目录下
二、元素定位及浏览器基本操作
2.1 启动浏览器
2.1.1 普通方式启动
启动Chrome浏览器:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('URL')
启动Firefox浏览器:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('URL')
启动IE浏览器:
from selenium import webdriver
browser = webdriver.Ie()
browser.get('URL')
2.1.2 Headless方式启动
Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。相比于现代浏览器,Headless Chrome 更加方便测试 web 应用,获得网站的截图,做爬虫抓取信息等。相比于较早的 PhantomJS,SlimerJS 等,Headless Chrome 则更加贴近浏览器环境。
Headless Chrome 对Chrome版本要求:
官方文档中介绍,mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+,同时chromedriver要求2.30+版本。
from selenium import webdriver
from selenium.webdrivermon.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdrivermon.action_chains import ActionChains
from selenium.webdrivermon.keys import Keys
chrome_options = webdriver.ChromeOptions() # 使用headless无界面浏览器模式chrome_options.add_argument('--headless') #增加无界面选项
chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
# 启动浏览器,获取网页源代码#
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get("URL")
print(f"browser text = {browser.page_source}")
browser.quit()
2.1.3 加载配置启动浏览器
Selenium操作浏览器是不加载任何配置的,下面是关于加载Chrome配置的方法:
用Chrome地址栏输入chrome://version/,查看自己的“个人资料路径”,然后在浏览器启动时,调用这个配置文件,代码如下:
#coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #设置成用户自己的数据目录
driver=webdriver.Chrome(chrome_options=option)
而加载Firefox配置的方法有些不同:
打开Firefox点右上角设置>?(帮助)>故障排除信息>显示文件夹,打开后把路径复制下来就可以了
# coding=utf-8
from selenium import webdriver
# 配置文件地址
profile_directory = r'C:\Users\\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
# 加载配置配置profile = webdriver.FirefoxProfile(profile_directory)
# 启动浏览器配置driver = webdriver.Firefox(profile)
2.1.4 浏览器基本操作
1、浏览器关闭、前进、后退、刷新
driver.close()#关闭当前焦点所在的页面
driver.quit()#完全退出并关闭浏览器
driver.forward()#前进,切换到下一页
driver.back()#后退,返回上一页,相当于浏览器左上角的左箭头按钮
driver.refresh()#刷新页面后当前页面的数据全部被清空,相当于浏览器输入框后面的刷新按钮
2、设置窗口大小 driver.maximiza_window() #最大化 driver.minimize_window() #最小化 driver.set_window_size(1920,1080) # print(driver.get_window_size())#获取当前窗口的大小
3、获取浏览器属性的方法
print(driver.title) # 获取当前的值
print(driver.current_url) # 获取当前的浏览器地址
print(driver.page_source) # 获取页面的源码信息
print(driver.capabilities) # 获取字典类型
print(driver.window_handles) #获取当前当前窗口的句柄,所有的窗口、返回字符串
driver.switch_to.window(driver.window_handles[-1]) #切换窗口到最后一个页面
driver.switch_to.window(driver.window_handles[0]) #返回到原窗口
driver.name #获取浏览器名称
4、文本链接🔗
driver.find_element_by_partial_link_text('新闻').click()
drive.back()
driver.find_element_by_link_text('地图').click()
5、判断页面元素是否可见 is_displayed1 = (driver.find_element_by_partial_link_text('地图').is_displayed()) print("返回布尔值:", is_displayed1)
6、判断页面元素是否可操作 is_displayed1 = (driver.find_element_by_partial_link_text('地图').is_enabled()) print("返回布尔值:", is_displayed1)
7、获取页面元素属性的内容
print(driver.find_element_by_partial_link_text('地图').get_attribute("name")
8、获取页面元素的标签内容print(driver.find_element_by_partial_link_text('地图').get_property("textContent"))
get_property('innerHTML')# 获取元素内的全部HTML get_property('outerHTML')# 获取包含选中元素的HTML
9、截屏
1.打开网站之后,也可以对屏幕截屏
2.截屏后设置制定的保存路径+文件名称+后缀
driver.get_screenshot_as_file('本地路径')
10、退出
1.退出有两种方式,一种是close;另外一种是quit
2.close用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口
3.quit用于结束进程,关闭所有的窗口
4.最后结束测试,要用quit。quit可以回收c盘的临时文件
driver.close() #闭当前窗口
driver.quit() #结束进程
基本操作进阶处理
模拟鼠标键盘的复杂操作行为 1)导入支持双击操作的模块 from selenium.webdrivermon.action_chains import ActionChains 2)创建实例 ac=ActionChains(driver) 1.1鼠标双击操作 (比如某一个按钮需要连续点击两次才可显示内容) button = driver.find_element_by_class_name('double') ac.double_click(button).perform()#双击后 点击执行 1.2鼠标移动到页面元素 button = driver.find_elements_by_class_name('over') ac.move_to_element('button').perform()#移动 点击执行 1.3综合操作 button1 = driver.find_element_by_class_name('double') button2 = driver.find_element_by_class_name('over')
ac.double_click(button1)#双击 ac.perform()#执行 ac.move_to_element(button2)#移动 ac.perform()#执行 1.4鼠标滑动、三种方式 方式一:点击且按住 slider = driver.find_element_by_xpath('//div[@id="slider"]/span[1]') # 按住滑动的按钮 ac.click_and_hold(slider) # 向右移动到confirm元素 confirm = driver.find_element_by_id('slider_confirm') ac.move_to_element(confirm) # 鼠标放开 c.release() # 执行 ac.perform() 方式二:拖拽并且放开 slider = driver.find_element_by_xpath('//div[@id="slider"]/span[1]') confirm = driver.find_element_by_id('slider_confirm') ac.drag_and_drop(slider, confirm).perform()#开始目标、结束目标、执行 方式三:坐标拖拽x 和 y slider = driver.find_element_by_xpath('//div[@id="slider"]/span[1]') ac.drag_and_drop_by_offset(slider,1000,0).perform()
1.5模拟键盘按键、如Tab、Enter 导入键盘操作 from selenium.webdrivermon.keys import Keys driver.find_element_by_id('user').click() ac.send_keys('我来了') ac.send_keys(Keys.TAB) ac.send_keys('我在这儿') ac.send_keys(Keys.ENTER) ac.send_keys('在这儿') ac.perform() 1.6跳转到js弹窗
driver.find_element_by_class_name('alert').click() driver.switch_to.alert.accept() #确定 switch_to切换 driver.switch_to.alert.dismiss() #取消 driver.switch_to.alert.send_keys('我在这里') #输入可见的内容 1.7跳转 frame 嵌套的网页 进入的时候需要一层一层、出来时可直接跳转到最外层 driver.switch_to.frame('aa') # 嵌套的ID driver.find_element_by_id('kw').send_keys('慧测') driver.find_element_by_id('su').click()
driver.switch_to.frame(0) # 嵌套的index driver.find_element_by_id('kw').send_keys('慧测') driver.find_element_by_id('su').click()
# 参数用element fr = driver.find_element_by_id('aa') driver.switch_to.frame(fr) driver.switch_to.default_content() #跳转最外层 1.8植入Cookie ---免登陆
driver.get('http://www.huicewang/ecshop') driver.add_cookie({'name': '', 'value': ''}) driver.add_cookie({'name': '', 'value': ''}) driver.add_cookie({'name': '', 'value': ''}) driver.refresh() 1.9隐式等待时间 driver.implicitly_wait(10) 2.0植入js javascript
移除input的只读属性readonly driver.get('file:///Users/chenhy/Documents/demo.html') #本地 driver.execute_script('document.getElementById("text").readOnly=false') true为只读 driver.find_element_by_id('text').send_keys('再向上')#修改信息
2.1滚屏 driver.execute_script('window.scrollTo(0,100)')
2.2 判断元素是否存在或者可以点击
is_enabled() 是否可以编辑,或者按钮是否可以点击
is_displayed() 判断元素是否显示
is_selected() 判断元素是否选中状态
selenium元素定位
1、xpath的contains函数进行查找文本文字内容
//*[contains(text(),'后台审核')] ,意思就是说,查找整个HTML文档里,从根节点开始数,不管什么标签,只要中间有“后台审核”四个字,就给我定位到
//div[contains(text(),"包含的字符串")]
text() 函数文本定位
page_next = driver.find_element(By.XPATH, '//a[text()="下一页")]')
page_next = driver.find_element(By.XPATH, '//a[contains(text(), "下一页")]')
//input[starts-with(@name,'name1')] 查找name属性中开始位置包含'name1'关键字的页面元素
//input[contains(@name,'na')] 查找name属性中包含na关键字的页面元素
<a href="http://www.baidu">百度搜索</a>
xpath写法为 //a[text()='百度搜索']
或者 //a[contains(text(),"百度搜索")]
2.Python通过xpath查找元素通过selenium读取元素信息
e=driver.find_element_by_xpath('//*[@id="lg"]/img')
print e
print e.text
print e.id
print e.tag_name
print type(e)
更多推荐
Python Selenium基础知识--环境介绍
发布评论