上期我们讲了一些selenium一些最近的元素定位,触发事件,等待等等,今天我们继续来看看接下来的知识点。
Selenium定位一组元素
之前我们讲过使用selenium定位某一个元素,一共有八种定位方法,今天我们来看看使用selenium来定位一组元素。定位一个元素与定位一组元素的方法其实差异并不大,可以说只有一点。我们来看看定位一组元素的这八种方法吧:
代码语言:javascript复制find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
与之前的方法比较可以发现其实基本上没有区别,就是在原来的element后面加了一个s罢了(加个s表示复数嘛),使用起来也是非常的简单。
我们可以用selenium来试一个例子:
代码语言:javascript复制from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/s?wd=selenium&rsv_spt=1&rsv_iqid=0xc210dd3f00035da7&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=7&rsv_sug1=7&rsv_sug7=100")
# 定位一组元素
texts = driver.find_elements_by_xpath('//div/h3/a')
# 循环遍历出每一条搜索结果for t in texts:
print(t.text)
driver.quit()
运行结果:
Selenium多表单切换
在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
我们来看看网易的126邮箱就是其中的一个例子。
通过截图我们看到了,登录框是在iframe里面的,所以在获取输入框之前,我们必须要先切换到iframe,然后再输入用户名密码进行登录。switch_to.frame()
默认可以直接取表单的id 或name属性。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("xxxxx")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("xxx")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
driver.quit()
那如果iframe没有可用的id和name属性,我们应该怎么办呢?
我们还有下面这种骚操作:
代码语言:javascript复制#先通过xpth定位到iframe
xf = driver.find_element_by_xpath(
'//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
driver.switch_to.parent_frame()
最后还有一点要说的就是switch_to.default_content()
跳回最外层的页面。
Selenium多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口(tab),这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
我们在百度主页点击注册的时候会出新的注册窗口,这个时候会跳出一个新的Tab,如果要实现原来tab和新的tab之间的转换,这个时候就是我们所谓的多窗口切换了。
主要涉及的方法:
代码语言:javascript复制current_window_handle:获得当前窗口句柄。
window_handles:返回所有窗口的句柄到当前会话。
switch_to.window():
用于切换到相应的窗口,与上一节的switch_to.frame()类似,
前者用于不同窗口的切换,后者用于不同表单之间的切换。
我们来看看代码操作:
代码语言:javascript复制from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()
# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
driver.switch_to.window(handle)
driver.find_element_by_name(
'account').send_keys('xxxx')
driver.find_element_by_name(
'password').send_keys('xxx')
time.sleep(2)
driver.quit()
Selenium警告框处理
在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。
代码语言:javascript复制text:
返回 alert/confirm/prompt 中的文字信息。
accept():
接受现有警告框。
dismiss():
解散现有警告框。
send_keys(keysToSend):
发送文本至警告框。keysToSend:将文本发送至警告框。
一般在操作中我们的做法是这样的:
代码语言:javascript复制# 接受警告框
driver.switch_to.alert.accept()
点击确认,使用accept方法即可。
感兴趣的可以做做下面这个exercise:
代码语言:javascript复制from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)
# 接受警告框
driver.switch_to.alert.accept()
driver.quit()
Selenium下拉框选择
在web测试的时候我们免不了使用下拉框来进行选择, 如百度搜索设置的下拉框,我们主要使用两个步骤来获取下拉框的选择:
代码语言:javascript复制Select类用于定位select标签。
select_by_value() 方法用于定位下接选项中的value值。
下面我们再来看看百度的例子:
代码语言:javascript复制from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
driver.find_element_by_link_text('设置').click()
sleep(1)
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
sleep(2)
# 搜索结果显示条数
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条
driver.quit()
Selenium文件上传
关于文件上传这个东西其实还是挺简单的,它其实只是传的一个路径字符串,也就是说,本质上其实还是对input使用sendkeys()方法。和输入用户名密码是一个道理的。
代码语言:javascript复制from selenium import webdriver
import os
driver = webdriver.Chrome()
#打开自己手写的那个HTML文件
file_path = 'file:///' os.path.abspath('a.html')
driver.get(file_path)
# 定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\upload.py')
driver.quit()
Selenium cookie操作
有的同学可能还不知道cookie是什么,Cookie是保存在客户端的纯文本文件。比如txt文件。所谓的客户端就是我们自己的本地电脑。当我们使用自己的电脑通过浏览器进行访问网页的时候,服务器就会生成一个证书并返回给我的浏览器并写入我们的本地电脑。这个证书就是cookie。一般来说cookie都是服务器端写入客户端的纯文本文件。
这边我们不做特别详细介绍,大家不懂的可以去这里看看。
https://jingyan.baidu.com/article/9f7e7ec0e5e8986f28155419.html
有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。
WebDriver操作cookie的方法:
代码语言:javascript复制get_cookies():
获得所有cookie信息。
get_cookie(name):
返回字典的key为“name”的cookie信息。
add_cookie(cookie_dict) :
添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。
delete_cookie(name,optionsString):
删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项。
delete_all_cookies():
删除所有cookie信息。
下面我们尝试一下获取cookie的信息:
代码语言:javascript复制from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.taobao.com")
# 获得cookie信息
cookie= driver.get_cookies()
# 将获得cookie的信息打印
print(cookie)
driver.quit()
下面我们可以把信息写入cookie:
代码语言:javascript复制# 向cookie的name 和value中添加会话信息
driver.add_cookie(
{'name': 'qwqertetwer', 'value': 'asddsfdgfdg'})
# 遍历cookies中的name 和value信息并打印
for cookie in driver.get_cookies():
print(cookie['name'], cookie['value'])
Selenium调用JS代码
我们的前端基本上都是用js写的,所以在进行自动化的时候或多或少的需要调用一些js代码,这个时候selenium就展现出它的优越性了,它可以直接调用js代码。
代码语言:javascript复制js = "console.log(a)"
driver.execute_script(js)
就是这么简单,只需要调用execute_script()这个方法就可以把js代码当做字符串一样传进去。
下面我们可以看一个具体的例子:
代码语言:javascript复制from selenium import webdriver
from time import sleep
# 访问百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
# 设置浏览器窗口大小
driver.set_window_size(500, 500)
# 搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(2)
# 通过javascript设置浏览器窗口的滚动条位置
js="window.scrollTo(100,450);"
driver.execute_script(js)
sleep(3)
driver.quit()
Selenium窗口截图
自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。
代码语言:javascript复制# 截取当前窗口,指定截图图片的保存位置
driver.get_screenshot_as_file("C:\Users\Screenshot\1.jpg")
下面可以来看一个具体的实验:
代码语言:javascript复制from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)
# 截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\baidu_img.jpg")
driver.quit()
Selenium关闭浏览器
这个步骤在之前的每个exercise我们都有执行过,之前没介绍,那我们最后就来说一下,每个代码的最后一行,一般都是退出浏览器,我们通常使用quit()方法,quit()一般是用来关闭单个窗口的。如果我们有多个窗口,而且要一次性全部关闭的话就需要使用close()方法了,
代码语言:javascript复制# 关闭单个窗口
driver.quit()
# 关闭多个窗口,全部关闭
driver.close()
关于selenium的基础知识点差不多就这么多啦,如果还有不足的或者没有讲到的欢迎私信小编,我会尽力把它完善好哒!
Thanks!
【Bye,My friend in ERICSSON,I won't forget you forerver】