知否知否-----selenium知多少(二)

简介: 知否知否-----selenium知多少(二)

上期我们讲了一些selenium一些最近的元素定位,触发事件,等待等等,今天我们继续来看看接下来的知识点。


Selenium定位一组元素


之前我们讲过使用selenium定位某一个元素,一共有八种定位方法,今天我们来看看使用selenium来定位一组元素。定位一个元素与定位一组元素的方法其实差异并不大,可以说只有一点。我们来看看定位一组元素的这八种方法吧:

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来试一个例子:

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()

运行结果:

640.jpg


Selenium多表单切换


在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

我们来看看网易的126邮箱就是其中的一个例子。


640.jpg


通过截图我们看到了,登录框是在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属性,我们应该怎么办呢?

我们还有下面这种骚操作:

#先通过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之间的转换,这个时候就是我们所谓的多窗口切换了。

主要涉及的方法:

current_window_handle:获得当前窗口句柄。


window_handles:返回所有窗口的句柄到当前会话。


switch_to.window():

用于切换到相应的窗口,与上一节的switch_to.frame()类似,

前者用于不同窗口的切换,后者用于不同表单之间的切换。


我们来看看代码操作:

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等方法进行操作。

text:
返回 alert/confirm/prompt 中的文字信息。
accept():
接受现有警告框。
dismiss():
解散现有警告框。
send_keys(keysToSend):
发送文本至警告框。keysToSend:将文本发送至警告框。


一般在操作中我们的做法是这样的:

# 接受警告框
driver.switch_to.alert.accept()


点击确认,使用accept方法即可。


感兴趣的可以做做下面这个exercise:

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测试的时候我们免不了使用下拉框来进行选择, 如百度搜索设置的下拉框,我们主要使用两个步骤来获取下拉框的选择:

Select类用于定位select标签。
select_by_value() 方法用于定位下接选项中的value值。

下面我们再来看看百度的例子:

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()方法。和输入用户名密码是一个道理的。


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的方法:

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的信息:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.taobao.com")
# 获得cookie信息
cookie= driver.get_cookies()
# 将获得cookie的信息打印
print(cookie)
driver.quit()

下面我们可以把信息写入cookie:

# 向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代码。


js = "console.log(a)"
driver.execute_script(js)


就是这么简单,只需要调用execute_script()这个方法就可以把js代码当做字符串一样传进去。

下面我们可以看一个具体的例子:

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()来截取当前窗口。


# 截取当前窗口,指定截图图片的保存位置
driver.get_screenshot_as_file("C:\\Users\\Screenshot\\1.jpg")


下面可以来看一个具体的实验:

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()方法了,

# 关闭单个窗口
driver.quit()
# 关闭多个窗口,全部关闭
driver.close()



关于selenium的基础知识点差不多就这么多啦,如果还有不足的或者没有讲到的欢迎私信小编,我会尽力把它完善好哒!


Thanks!

相关文章
|
Web App开发 存储 缓存
知否知否-----selenium知多少
知否知否-----selenium知多少
236 0
|
2月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
142 5
|
11天前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
62 19
Selenium IDE:Web自动化测试的得力助手
|
13天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
95 17
Selenium:强大的 Web 自动化测试工具
|
2月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
2月前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
500 5
|
2月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
1月前
|
Web App开发 设计模式 JavaScript
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
44 0
|
2月前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
389 1
|
2月前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。

热门文章

最新文章