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 操作浏览器的属性