Python实现Web UI自动化测试实战:Selenium 3/4+unittest/Pytest+GitLab+Jenkins
上QQ阅读APP看书,第一时间看更新

5.1 Selenium常用方法

本节我们来看一下Selenium操作浏览器的常用方法,例如打开、关闭浏览器,以及获取浏览器的一些属性(如页面标题、页面URL等)。

5.1.1 打开、关闭浏览器

◆目的

使用WebDriver提供的API打开、关闭浏览器(Chrome和Firefox浏览器)。

◆关键字

●打开Chrome浏览器:webdriver.Chrome()。

●打开Firefox浏览器:webdriver.Firefox()。

●关闭当前浏览器窗口:driver.close()。

●退出浏览器进程:driver.quit()。

◆示例代码:test5_1.py

# 要使用WebDriver提供的API,首先要导入包
from selenium import webdriver
from time import sleep

# 定义一个变量,用来存储实例化后的浏览器,这里打开Chrome浏览器
driver1 = webdriver.Chrome()
sleep(2) # 这里等待2秒,看效果
driver1.close() # 关闭当前浏览器窗口
# 定义一个变量driver2,用来打开Firefox浏览器
driver2 = webdriver.Firefox()
sleep(2)
driver2.quit() # 退出浏览器进程

◆运行结果

打开Chrome浏览器,等待2秒,关闭Chrome浏览器窗口;打开Firefox浏览器,等待2秒,然后退出Firefox浏览器进程。

◆注意事项

●PyCharm并不会自动在“webdriver.Chrome”后面加括号,需要大家自己补全,否则会报错。

●关于关闭浏览器窗口(close方法)和退出浏览器进程(quit方法)的区别,将在5.1.11小节讲解。

5.1.2 访问某个网址

◆目的

使用WebDriver提供的API访问指定的网址。

◆关键字

get('https://www.ptpress.com.cn/')

◆示例代码:test5_2.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
# 通过get方法访问网址,这里访问人民邮电出版社官网
driver.get('https://www.ptpress.com.cn/')
sleep(2)
driver.quit()

◆运行结果

成功打开人民邮电出版社官网。

◆注意事项

get方法后面括号中的网址必须带着访问网址的网络协议,即“https”或“http”。

5.1.3 网页的前进和后退

◆目的

借助WebDriver提供的API实现浏览器上的网页前进或后退功能。

◆关键字

●网页后退:back方法。

●网页前进:forward方法。

◆示例代码:test5_3.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/') # 打开百度首页
sleep(2)
driver.get('https://www.ptpress.com.cn/') # 打开人民邮电出版社官网首页
sleep(2)
driver.back() # 通过back方法后退到百度首页
sleep(2)
driver.forward() # 通过forward方法前进到人民邮电出版社官网首页
sleep(2)
driver.quit()

◆运行结果

打开百度首页,等待2秒;打开人民邮电出版社官网首页,等待2秒;返回到百度首页,等待2秒;再次前进到人民邮电出版社官网首页,等待2秒,退出浏览器。

5.1.4 刷新浏览器页面

◆目的

使用WebDriver提供的API实现页面刷新的功能。

◆关键字

刷新页面:refresh方法。

◆示例代码:test5_4.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.ptpress.com.cn/') # 打开人民邮电出版社官网首页
sleep(2)
driver.refresh() # 通过refresh方法刷新页面
sleep(2)
driver.quit()

◆运行结果

打开人民邮电出版社官网首页,等待2秒,借助refresh方法刷新页面(重新加载),再等待2秒,退出浏览器。

5.1.5 浏览器窗口最大化、最小化和全屏

◆目的

使用WebDriver提供的API实现浏览器窗口最大化、最小化或全屏。

◆关键字

●浏览器窗口最大化:driver.maximize_window方法。

●浏览器窗口最小化:driver.minimize_window方法。

●浏览器窗口全屏:driver.fullscreen_window方法。

◆示例代码:test5_5.py

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
sleep(2)
driver.maximize_window()  #最大化
sleep(2)
driver.minimize_window()  #最小化
sleep(2)
driver.fullscreen_window()
sleep(2)
driver.quit()

◆运行结果

打开百度首页,当前的窗口非全屏,等待2秒后,窗口最大化;然后等待2秒后,窗口最小化(可以在任务栏中看到);再等待2秒后,窗口全屏;最后等待2秒后,退出浏览器。

5.1.6 获取、设置浏览器窗口的大小

◆目的

使用WebDriver提供的API获取或设置浏览器窗口的大小。

◆关键字

●获取当前浏览器窗口的大小:driver.get_window_size方法。

●设置浏览器窗口的大小:set_window_size(500,800)。

◆示例代码:test5_6.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
winsize = driver.get_window_size() # 获取当前窗口的大小
print(winsize)
print(type(winsize)) # 输出winsize变量的类型
sleep(2)
driver.set_window_size(500,800) # 设置窗口的大小
sleep(2)
driver.quit()

◆运行结果

WebDriver打开了百度的首页,然后输出了当前窗口的大小,等待2秒后,将浏览器窗口的大小设置为宽1050像素、高660像素,最后退出浏览器。

控制台的输出内容如下。

{'width': 1050, 'height': 660}
<class 'dict'>

◆注意事项

获取的浏览器窗口大小的结果的类型是字典。

5.1.7 获取、设置浏览器窗口的位置

◆目的

使用WebDriver提供的API获取或设置浏览器窗口的位置。

◆关键字

●获取窗口的位置:driver.get_window_position方法。

●设置窗口的位置:set_window_position(500,300)。

◆示例代码:test5_7.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
pos = driver.get_window_position() # 获取窗口的位置
print(pos)
sleep(2)
driver.set_window_position(500,300) # 设置窗口的位置
sleep(2)
print(driver.get_window_position()) # 再次输出窗口的位置
driver.quit()

◆运行结果

{'x': 10, 'y': 10}
{'x': 500, 'y': 300}

◆注意事项

●获取窗口位置的结果的类型为字典。

●设置窗口位置的两个参数,默认第一个参数为宽,第二个参数为高。

5.1.8 获取页面的title

◆目的

使用WebDriver提供的API获取页面的title。

◆关键字

获取页面的title:driver.title。

◆示例代码:test5_8.py

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
title = driver.title # 输出当前网页的title,即“百度一下,你就知道”
print(title)
driver.quit()

◆运行结果

百度一下,你就知道

◆注意事项

●title后面并没有括号,因为它是一个属性而不是方法,前者不带括号,后者带括号,如图5-3所示。

图5-3 属性和方法

●通过获取页面的title,可以判断是否成功打开了某个网址。

思考:能否通过title判断是否登录成功?如果不行,用什么判断比较好?

5.1.9 获取当前页面的URL地址

◆目的

使用WebDriver提供的API获取当前页面的URL地址。

◆关键字

获取当前页面的URL地址:driver.current_url。

◆示例代码:test5_9.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
url = driver.current_url # 获取当前页面的URL地址
print(url)
driver.quit()

◆运行结果

https://www.baidu.com/

5.1.10 获取页面的源码

◆目的

使用WebDriver提供的API获取页面的源码。

◆关键字

获取页面的源码:driver.page_source。

◆示例代码:test5_10.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
pagesource = driver.page_source # 获取页面的源码
print(pagesource)
driver.quit()

◆运行结果(部分)

<!DOCTYPE html><!--STATUS OK--><html><head> 
<script type="text/javascript" charset="UTF-8" src="https://dss0.bdstatic.com/5aV1bjqh_ 
Q23odCf/static/superman/js/super_load-2aa20826e0.js"></script><meta http-equiv= 
"Content-Type" content="text/html;charset=UTF-8" /><meta http-equiv="X-UA-Compatible"  
content="IE=edge,chrome=1" /><meta content="always" name="referrer" /><meta name="theme- 
color" content="#2932e1" /><link rel="shortcut icon" href="/favicon.ico" type="image/
x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/
content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask="" href="//
www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd86.svg" /><link rel="dns-
prefetch" href="//dss0.bdstatic.com" /><link rel="dns-prefetch" href="//dss1.
bdstatic.com" /><link rel="dns-prefetch" href="//ss1.bdstatic.com" /><link rel="dns-
prefetch" href="//sp0.baidu.com" /><link rel="dns-prefetch" href="//sp1.baidu.
com" /><link rel="dns-prefetch" href="//sp2.baidu.com" /><title> 百度一下,你就知道</
title><style type="text/css" id="css_index" index="index">body,html{height:100%}
html{overflow-y:auto}body{font:12px} 


</body></html>

◆注意事项

可以通过判断页面源码中是否包含某个关键字来做断言。

5.1.11 多窗口操作(Selenium 3)

当我们单击Web页面上的超链接时,有可能会打开一个新窗口或新标签,并且这个新窗口或标签会处于当前页面(可操作)。不过这对Selenium WebDriver来说是个难题,因为它并不知道哪个窗口处于当前状态(active,可操作)。因此,要想在新打开的窗口或标签中进行操作,首先要切换到新窗口或标签。每个窗口都有一个唯一标识,我们称之为“句柄”,该标识在单个会话中保持不变(浏览器不关闭就不会发生改变)。Selenium允许使用句柄来操作窗口或标签。

◆目的

使用WebDriver提供的API获取浏览器窗口句柄,通过句柄切换当前窗口,从而达到在指定窗口中进行操作的目标。

◆关键字

●获取当前窗口句柄:driver.current_window_handle。

●获取所有窗口句柄:driver.window_handles。

●切换当前窗口:driver.switch_to.window(all_handles[1])。

◆示例代码:test5_11.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/index.htm')
print(driver.current_window_handle)  # 查看当前窗口句柄
driver.find_element_by_link_text('Window Open Test').click()  # 打开新window1
print(driver.window_handles)  # 查看所有窗口句柄
sleep(2)
driver.close()
print(driver.window_handles)# 查看现在的所有窗口句柄,可以看到第一个窗口关闭,第二个窗口还在
sleep(2)
driver.quit()  # 可以看到所有窗口都被关闭

◆运行结果

CDwindow-28B5543FCF4D2FCE6DAF4549DCE84574
['CDwindow-28B5543FCF4D2FCE6DAF4549DCE84574', 'CDwindow-373B8346ED8BF3F7A11391657017222C']
['CDwindow-373B8346ED8BF3F7A11391657017222C']

注:close只能关闭当前窗口(处于active状态的窗口),quit能够退出整个浏览器进程。

◆示例代码:test5_12.py

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/index.htm')
first_handle = driver.current_window_handle # 将第一个窗口句柄存储到变量first_handle中
driver.find_element_by_link_text('Window Open Test').click()  # 打开新window1
all_handles = driver.window_handles # 将所有窗口句柄存储起来,是一个列表
# 接下来,我们要将当前窗口切换到窗口2,然后操作窗口2中的元素,例如单击链接“Link Test”
sleep(2)
driver.switch_to.window(all_handles[1])  # 切换窗口
driver.switch_to.frame(0) # 切换到第一个frame中
driver.find_element_by_link_text('Link Test').click()
sleep(2)
driver.quit()  # 可以看到所有窗口都被关闭

◆运行结果

上面的代码实现了单击窗口2中的上半部分(iframe)的“Link Test”的效果。

◆注意事项

可以将浏览器的句柄理解为每个窗口的唯一标识,要想在某个窗口中进行操作,就需要通过句柄把窗口切换为当前窗口。

另外,也可以尝试如下方式去切换窗口。

# 储存原始窗口句柄
original_window = driver.current_window_handle

# 检查当前有没有其他开启的窗口
assert len(driver.window_handles) == 1

# 单击链接,打开新窗口
driver.find_element(By.LINK_TEXT, "new window").click()

# 等待打开两个窗口
wait.until(EC.number_of_windows_to_be(2))

# 通过循环,找到一个新的窗口句柄,并切换为当前窗口
for window_handle in driver.window_handles:
     if window_handle != original_window:
          driver.switch_to.window(window_handle)
          break

5.1.12 多窗口操作(Selenium 4)

Selenium 4提供了一个新方法用于在打开一个新窗口或标签时,将其自动切换为当前状态。

◆示例代码

# 打开一个新标签,并切换到新标签
driver.switch_to.new_window('tab')

# 打开一个新窗口,并切换到新窗口
driver.switch_to.new_window('window')

新方法虽然简单,但是如果你已经打开了多个窗口,然后又打开新窗口,此种情况下还是需要使用循环的方式去切换窗口,然后才能进行相应的操作。

5.1.13 浏览器方法和属性总结

前面我们讲解了WebDriver提供的操作浏览器的一些方法和属性,本小节做个简单总结。

WebDriver提供的操作浏览器的方法如表5-1所示。

表5-1 操作浏览器的方法

续表

WebDriver提供的操作浏览器的属性如表5-2所示。

表5-2 操作浏览器的属性