WebDriver_常用API操作技巧(上)
访问某个网址
目的: 打开浏览器访问指定的网址,并判断
用于测试的网址: http://www.sogou.com
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.sogou.com")
assert driver.title.find("搜狗搜索引擎")>=0,"执行未通过"
driver.close()
网页的前进和后退
目的: 模拟浏览器上的前进和后退工能
用于测试的网址: http://www.sogou.com 、http://www.baidu.com
import time
from selenium import webdriver
firstURL="http://www.sogou.com"
secondURL="http://www.baidu.com"
driver = webdriver.Chrome()
driver.get(firstURL)
driver.get(secondURL)
driver.back()
driver.forward()
driver.close()
刷新当前网页
目的: 通过程序实现刷新页面功能
用于测试的网址: http://www.sogou.com
import time
from selenium import webdriver
firstURL="http://www.sogou.com"
driver = webdriver.Chrome()
driver.get(firstURL)
driver.find_element_by_id("query").send_keys("厉害了,我的国")
time.sleep(2)
driver.refresh()
time.sleep(2)
driver.close()
浏览器窗口最大化
目的: 通过程序实现刷新页面功能
用于测试的网址: http://www.baidu.com
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print("浏览器最大化")
driver.maximize_window() #将浏览器最大化显示
time.sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
driver.close()
获取并设置当前窗口的位置
目的: 改变浏览器窗口的位置
用于测试的网址: http://www.sogou.com
注意:
get_window_position()获取的是浏览器左上角所在的屏幕上的位置,返回的是x,y坐标值。
get_window_position()和set_window_position()方法在部分浏览器的部分版本上失效。
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.sogou.com")
#获取当前浏览器在屏幕上的位置,返回的是字典对象
position = driver.get_window_position()
print("当前浏览器所在位置的横坐标:",position['x'])
print("当前浏览器所在位置的纵坐标:",position['y'])
#设置当前浏览器在屏幕上的位置
driver.set_window_position(y=200, x=400)
print(driver.get_window_position())
driver.close()
获取并设置当前窗口的大小
目的: 改变浏览器窗口的大小以适应M版网站
用于测试的网址: http://www.sogou.com
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://m.sogou.com")
#获取当前浏览器窗口大小,返回的是字典对象
position = driver.get_window_size()
print("当前浏览器所在位置的宽:",position['width'])
print("当前浏览器所在位置的高:",position['height'])
#设置当前浏览器窗口大小
driver.set_window_size(width=316, height=600,windowHandle='current')
time.sleep(3)
print(driver.get_window_size())
driver.close()
获取页面的Title属性值
目的: 通过获取页面title属性判断页面是否正常打开
用于测试的网址: http://www.baidu.com
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
tab1=driver.title
print(tab1)
assert tab1=="百度一下,你就知道","页面title属性值错误"
driver.close()
获取页面的HTML源代码
目的: 无法定位判断元素时,通过获取页面源码的方式读取判断关键字
用于测试的网址: http://www.sogou.com
from selenium import webdriver
import time,unittest
driver = webdriver.Firefox()
driver.get("http://www.sogou.com")
pageSrc=driver.page_source
print(pageSrc)
assert "新闻" in pageSrc, "找不到该文字"
driver.close()
获取当前页面的URL地址
目的: 判断当前打开页面是否目标页
用于测试的网址: http://www.sogou.com
from selenium import webdriver
import time,unittest
driver = webdriver.Firefox()
driver.get("https://www.sogou.com/")
currentPage=driver.current_url
print(currentPage)
assert "www.sogou.com" in currentPage, "当前非目标页面"
driver.close()
获取与切换浏览器窗口句柄
目的: 获取所有打开窗口的句柄,并在这些句柄间切换。
用于测试的网址: http://www.baidu.com
from selenium import webdriver
import time,unittest
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("laohu")
driver.find_element_by_id("su").click()
time.sleep(10)
driver.find_element_by_xpath("/html/body/div[1]/div[5]/div[1]/div[3]/div[2]/h3/a").click()
time.sleep(5)
all_handles=driver.window_handles
print("所有窗口句柄:",all_handles)
driver.close()
测试场景:
打开百度新闻(页面A)
点击热点新闻中第一个新闻链接(一般是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B)
测试需要去判断你点击这个这个新闻,在打开的详情页是否正确。
问题拆分:
1.我们已经知道switch_to.window()方法可以处理窗口切换的问题
2. 在页面A跳转到页面B之前,我们需要用一个变量保存这个新闻的标题
3. 切换到页面B后,我们获取这个新闻标题,然后和前面这个变量保存的值去对比,如果相等,那么就测试通过。
分两个步骤去解答这个测试需求:
1.先实现页面A切换到页面B
2.页面A和页面B两个新闻标题进行对比
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://news.baidu.com')
time.sleep(2)
driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()
print(driver.current_window_handle) # 输出当前窗口句柄
handles = driver.window_handles # 获取当前全部窗口句柄集合
print(handles) # 输出句柄集合
for handle in handles:# 切换窗口
if handle != driver.current_window_handle:
print('switch to second window',handle)
driver.close() # 关闭第一个窗口
driver.switch_to.window(handle) #切换到第二个窗口
time.sleep(5)
driver.quit()
分两个步骤去解答这个测试需求:
1.先打印当前窗口(页面A)句柄,一个长字符串
2.获取全部窗口句柄,这里我们有两个,打印出这两个句柄。
3. for 循环遍历,当发现其中一个句柄和当前句柄不相等,这里做了三件事,第一件,打印一个语句,告诉你马上要切换到第二个窗口,第二件,关闭当前窗口,这里指页面A,第三,切换到页面B窗口。
获取页面元素的基本信息
目的: 对于页面关键元素有要求时,通过获取方式验证。
用于测试的网址: http://www.baidu.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
newsElement=driver.find_element_by_xpath("//a[text()='新闻']")
print("元素标签名:",newsElement.tag_name)
print("元素的大小:",newsElement.size)
driver.close()
获取页面元素的文本内容
目的: 获取页面关键文本,做为验证依据。
用于测试的网址: http://www.baidu.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
time.sleep(3)
aElement=driver.find_element_by_xpath("//*[@class='mnav'][1]")
a_text=aElement.text
print(a_text)
assert "新闻"==a_text,"元素缺失"
driver.close()
判断页面元素是否可见
目的: 获取页面不可视元素。
**用于测试的网址:**http://127.0.0.1/visible.html
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://127.0.0.1/visible.html')
div2 = driver.find_element_by_id("div2").is_displayed()
print("div2可视情况:",div2)
driver.find_element_by_id("button1").click()
div2 = driver.find_element_by_id("div2").is_displayed()
print("div2可视情况:",div2)
div4 = driver.find_element_by_id("div4").is_displayed()
print("div4可视情况:",div4)
driver.find_element_by_id("button2").click()
div4 = driver.find_element_by_id("div4").is_displayed()
print("div4可视情况:",div4)
driver.close()
判断页面元素是否可操作
目的: 获取页面元素的操作属性,判断结果。比如说,下一步按钮。
用于测试的网址: http://127.0.0.1/visible.html
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://127.0.0.1/enable.html')
input1 = driver.find_element_by_id("input1").is_enabled()
print("input1可操作情况:",input1)
input2 = driver.find_element_by_id("input2").is_enabled()
print("input2可操作情况:",input2)
input3 = driver.find_element_by_id("input3").is_enabled()
print("input3可操作情况:",input3)
driver.close()
获取页面元素的属性
目的: 获取页面元素的属性,可以一次定位多次使用。
用于测试的网址: http://www.sogou.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.sogou.com')
searchBox = driver.find_element_by_id("query")
print(searchBox.get_attribute('name'))
searchBox.send_keys("selenium")
print(searchBox.get_attribute('value'))
driver.close()
获取页面的CSS属性
目的: 获取页面元素的css属性,可以通过样式中的属性来判断当前页面的界面规格。
用于测试的网址: http://www.baidu.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
searchBox = driver.find_element_by_id("kw")
print("搜索输入框的高度:",searchBox.value_of_css_property('height'))
print("搜索输入框的宽度:",searchBox.value_of_css_property('width'))
font = searchBox.value_of_css_property('font-family')
print("搜索输入框的字体是:",font)
assert font=="arial", "不是默认字体"
driver.close()
清空输入框中的内容
目的: 通过清空操作,防止默认值对输入结果的影响。
清空输入框内的提示信息,例如用户名,密码等提示信息,如果直接输入内容,可能会与输入框的默认提示信息拼接,从而造成输入信息的错误,这时clear()将会变得非常有用
用于测试的网址: http://www.baidu.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(2)
driver.find_element_by_id("kw").clear()
time.sleep(2)
driver.find_element_by_id("kw").send_keys("软达启航")
time.sleep(2)
driver.close()
在输入框中输入指定内容
目的: 通过变量赋值的方式输入内容。
用于测试的网址: http://www.baidu.com
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
driver.find_element_by_id("kw").clear()
time.sleep(2)
text="软达启航"
driver.find_element_by_id("kw").send_keys(text)
time.sleep(2)
driver.close()
单击按钮
目的: 模拟鼠标左键单击操作。
用于测试的网址: http://127.0.0.1/click.html
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://127.0.0.1/click.html')
time.sleep(2)
driver.find_element_by_id('button').click()
time.sleep(2)
driver.close()
双击某个元素
目的: 模拟鼠标左键双击操作。
用于测试的网址: http://127.0.0.1/double.html
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/double.html')
time.sleep(2)
inputBox=driver.find_element_by_id('inputBox')
time.sleep(2)
action_chains = ActionChains(driver)
action_chains.double_click(inputBox).perform()
time.sleep(3)
driver.close()
操作单选下拉列表
目的: 模拟鼠标点击下拉列表操作。
Is_enabled():判断元素是否可操作
Is_selected():判断元素是否被选中
用于测试的网址: http://127.0.0.1/selectlist.html
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/selectlist.html')
select = driver.find_element_by_name('fruit')
all_options = select.find_elements_by_tag_name("option")
for option in all_options:
print("选项显示的文本:",option.text)
print("选项值为:",option.get_attribute("value"))
option.click()
time.sleep(3)
driver.close()
下拉列表元素选择的三种方式
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/selectlist.html')
select_element = Select(driver.find_element_by_xpath("//select"))
print(select_element.first_selected_option.text)
all_options = select_element.options
print(len(all_options))
方法一:通过序号选择第二个元素,序号从0开始
#方法一:通过序号选择第二个元素,序号从0开始
if all_options[1].is_enabled() and not all_options[1].is_selected():
select_element.select_by_index(1)
print(select_element.all_selected_options[0].text)
assert select_element.all_selected_options[0].text=="西瓜","选项异常"
time.sleep(3)
方法二:通过选项的显示文本选择文本为"猕猴桃"选项
#方法二:通过选项的显示文本选择文本为"猕猴桃"选项
select_element.select_by_visible_text("猕猴桃")
print(select_element.all_selected_options[0].text)
assert select_element.all_selected_options[0].text=="猕猴桃","选项异常"
time.sleep(3)
方法三:通过选项的value属性值选择value="shanzha"选项
#方法三:通过选项的value属性值选择value="shanzha"选项
select_element.select_by_value("shanzha")
print(select_element.all_selected_options[0].text)
assert select_element.all_selected_options[0].text=="山楂","选项异常"
driver.close()
断言单选列表选项值
目的: 判断单选列表内容是否与预期内容一致。
用于测试的网址: http://127.0.0.1/selectlist.html
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/selectlist.html')
select_element = Select(driver.find_element_by_xpath("//select"))
all_options = select_element.options
option_list = ['桃子','西瓜','桔子','猕猴桃','山楂','荔枝']
#使用python内置的map()获取页面中下拉列表成员对象
src_list = map(lambda option:option.text,all_options)
assert option_list==list(src_list),"选项不符"
print(option_list)
driver.close()
操作多选的选择列表
目的: 判断单选列表内容是否与预期内容一致。
用于测试的网址: http://127.0.0.1/mulist.html
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/mulist.html')
select_element = Select(driver.find_element_by_xpath("//select"))
select_element.select_by_index(0)
select_element.select_by_visible_text('山楂')
select_element.select_by_value('mihoutao')
for option in select_element.all_selected_options:
print(option.text)
time.sleep(2)
select_element.deselect_all()
time.sleep(2)
select_element.select_by_index(1)
select_element.select_by_visible_text('荔枝')
time.sleep(2)
select_element.deselect_by_index(1)
time.sleep(2)
driver.close()
操作可以输入的下拉列表
目的: 实现输入的同时模拟按键操作。
用于测试的网址: http://127.0.0.1/datalist.html
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/datalist.html')
driver.find_element_by_id("select").clear()
time.sleep(2)
driver.find_element_by_id("select").send_keys("豆",Keys.ARROW_DOWN)
time.sleep(1)
driver.find_element_by_id("select").send_keys(Keys.ARROW_DOWN)
time.sleep(1)
driver.find_element_by_id("select").send_keys(Keys.ENTER)
time.sleep(2)
driver.close()
操作单选框
目的: 实现单选的同时断言选项状态。
用于测试的网址: http://127.0.0.1/radio.html
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/radio.html')
berryRadio=driver.find_element_by_xpath("//input[@value='berry']")
berryRadio.click()
assert berryRadio.is_selected()==True, "草莓未被选中"
if berryRadio.is_selected():
watermelonRadio=driver.find_element_by_xpath("//input[@value='watermelon']")
watermelonRadio.click()
assert berryRadio.is_selected()==False, "草莓被异常选中"
driver.close()
操作复选框
目的: 实现输入的同时模拟按键操作。
用于测试的网址: http://127.0.0.1/checkbox.html
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://127.0.0.1/checkbox.html')
berryCheckBox=driver.find_element_by_xpath("//input[@value='berry']")
berryCheckBox.click()
assert berryCheckBox.is_selected()==True, "草莓未被选中"
if berryCheckBox.is_selected():
berryCheckBox.click()
assert berryCheckBox.is_selected()==False, "草莓被异常选中"
checkBoxList=driver.find_elements_by_xpath("//input[@name='fruit']")
for box in checkBoxList:
if not box.is_selected():
box.click()
time.sleep(3)
driver.close()