`
wx1568016009
  • 浏览: 23501 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

640?wx_fmt=png

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?wx_fmt=png

Selenium多表单切换

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

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

640?wx_fmt=png


通过截图我们看到了,登录框是在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!


640?wx_fmt=gif


【Bye,My friend in ERICSSON,I won't forget you forerver



分享到:
评论

相关推荐

    selenium-server-standalone和Selenium-java的jar包

    在这个主题中,我们将深入探讨"**selenium-server-standalone**"和"**Selenium-java**"这两个jar包,以及它们在Java+Selenium自动化测试中的作用。 首先,**selenium-server-standalone.jar**是Selenium WebDriver...

    selenium-server-4.1.1.jar

    Selenium 服务器(selenium-server-4.1.1.jar)

    selenium-server-standalone-2.40

    在这个名为 "selenium-server-standalone-2.40" 的压缩包中,包含了Selenium Server的独立版本以及相关的Java库。 1. **Selenium Server Standalone**: Selenium Server Standalone是Selenium的核心组件之一,它...

    selenium-selenium-4.5.0.zip源码

    在 `selenium-selenium-4.5.0.zip` 源码中,我们可以深入理解 Selenium 的内部实现,包括以下关键部分: 1. **WebDriver**: 这部分包含了各个浏览器驱动(如 ChromeDriver、GeckoDriver)的实现,它们作为桥梁,...

    selenium-server-standalone-4.0.0-alpha-2.zip

    标题 "selenium-server-standalone-4.0.0-alpha-2.zip" 指的是 Selenium 的一个服务器独立版本的归档文件,该版本为 4.0.0 的 Alpha 2 版本。Selenium 是一个广泛使用的自动化测试工具,主要用于 Web 应用程序的测试...

    selenium-java-4.0.0-alpha-6_javaselenium_

    标题 "selenium-java-4.0.0-alpha-6_javaselenium_" 指的是 Selenium 的一个 Java 版本的软件包,具体是 4.0.0 的第六个 Alpha 版本。Selenium 是一个广泛使用的自动化测试工具,主要用于 web 应用程序的测试。它...

    selenium-java-2.44.0、selenium-java-2.44.0-srcs、selenium-server-standalone-2.44.0

    首先,我们来了解一下 `selenium-java-2.44.0.jar`。这是一个预编译的Java库,其中包含了Selenium WebDriver的Java绑定。WebDriver是Selenium的一个核心部分,它提供了一个编程接口,允许测试脚本直接控制浏览器。...

    ruby selenium-client-1.2.18.gem

    4. command prompt go to –> C:\selenium-remote-control-1.0.3\selenium-server-1.0.3>java -jar selenium-server.jar 5. Download the RubyInstaller– The Ruby Installer is currently available only for the ...

    selenium-server-standalone-2.44.0.jar

    selenium-server-standalone-2.44.0, selenium最新服务器,

    selenium-java-2.45.0.jar

    selenium-java-2.45.0.jar

    selenium-server-standalone-2.45.0和selenium-java-2.45.0(含srcs)

    "selenium-server-standalone-2.45.0" 和 "selenium-java-2.45.0(含srcs)" 提供了Selenium在Java环境下的核心组件,以及一个独立的服务器版本,方便进行Web应用的自动化测试。 1. **Selenium Server Standalone**...

    selenium-server-standalone-3.141.0.jar

    最新版selenium-java,selenium-server-standalone-3.141.0.jar

    selenium-htmlunit-driver-2.9.0

    selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包

    selenium-server-standalone-3.141.59

    selenium-server-standalone-3.141.59.jar selenium-server-standalone-3.141.59.jar

    selenium-java 3.7.1.jar

    【Selenium-Java 3.7.1.jar】是一个关键组件,主要用于自动化Web应用程序的测试。这个特定的版本,3.7.1,是Selenium WebDriver的一个Java绑定,它允许开发者使用Java语言来编写测试脚本,从而实现对浏览器的自动化...

    selenium-java-2.47.1.zip

    这个压缩包 "selenium-java-2.47.1.zip" 包含了Selenium的Java版本,具体是2.47.1的更新,发布于2015年8月。这个版本在当时是一个稳定且广泛使用的版本,它提供了丰富的API,支持多种浏览器,并且可以与各种测试框架...

    selenium-4.1.0-py3-none-any.whl

    selenium-4.1.0-py3-none-any.whl

    selenium-server安装jar包selenium-server安装jar包

    selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium-server安装jar包selenium...

    selenium-server-standalone-2.53.1.jar

    selenium-server-standalone-2.53.1.jar用于支持selenium webdriver的开发,也可用于分布式测试连接

    selenium-server-standalone-3.8.1和selenium-java-3.7.1

    标题中的 "selenium-server-standalone-3.8.1" 指的是 Selenium 的独立服务器版本,3.8.1 是其版本号。这个服务器是 Selenium Grid 的基础,允许并行执行测试,提高了测试效率。它包含了所有 WebDriver 支持的浏览器...

Global site tag (gtag.js) - Google Analytics