1、前面介绍过,根据Selenium下的WebDriver类可以实例化一个浏览器WebDriver对象:返回WebDriver对象
2、打开一个指定网页、定位HTML文档中指定元素都是根据浏览器WebDriver对象的方法来实现的
⑴打开一个指定网页:WebDriver对象.get()
⑵元素定位:
①WebDriver对象.find_element_by_*()
②WebDriver对象.find_element()
③WebDriver对象.find_elements_by_*()
④WebDriver对象.find_elements()
3、在浏览器WebDriver对象下不仅有上面提到的几种方法,还有其他的方法和属性。因此这里主要介绍浏览器WebDriver对象的其他方法或属性
⑴浏览器WebDriver对象方法或属性:操作浏览器的
⑵至于前面提到过的元素WebElement对象的方法和属性后面继续介绍:操作元素的
1、可通过WebDriver对象下的name属性来获取当前所使用的浏览器名称
例1:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 获取当前浏览器名称
name = driver.name
print(name)
#chrome
1、在前面的元素定位的学习过程中可以发现,使用Selenium打开一个浏览器网页时,浏览器页面默认不是全屏的
2、但有时候我们希望浏览器能以某种尺寸打开,让访问的页面在这种尺寸下运行。因此WebDriver提供了以下方法来设置浏览器大小
⑴指定大小:set_window_size(width, height)
⑵全屏:maximize_window()
1、可以使用WebDriver对象下的set_window_size()方法来设置当前浏览器窗口的大小
2、语法:WebDriver对象.set_window_size(width, height, windowHandle='current')
⑴width:浏览器的宽度
⑵height:浏览器的高度
⑶windowHandle:默认为设置当前窗口(一般肯定是设置当前窗口)
例2:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.set_window_size(480,800)
# 打开指定网页
driver.get('https://www.baidu.com/')
1、可以使用WebDriver对象下的maximize_window()方法来设置当前浏览器窗口为全屏
2、语法:WebDriver对象.maximize_window()
⑴该方法无参数
例3:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口为全屏
driver.maximize_window()
# 打开指定网页
driver.get('https://www.baidu.com/')
1、在使用浏览器网页时,浏览器提供了前进和后退按钮,可以很方便的在浏览过的网页之间来回切换
2、WebDriver也提供了对应的方法来模拟前进和后退
⑴前进:WebDriver对象.forward()
⑵后退:WebDriver对象.back()
⑶WebDriver也的前进、后退功能跟实际操作浏览器一样,肯定是只能在同一个网页窗口上才能进行
例4:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 再次进入百度新闻页面
driver.get("http://news.baidu.com/")
# 退回百度首页
driver.back()
# 再次前进到新闻页面
driver.forward()
# 以上操作都是针对同一个网页窗口进行的
1、在实际使用浏览器网页时,我们需要手动刷新浏览器,以获取最新的数据
2、WebDriver也提供了对应的方法来模拟浏览器刷新
⑴WebDriver对象.refresh()
例5:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 刷新当前页面
driver.refresh()
1、浏览器的窗口其实也有属性的,浏览器窗口的属性用句柄(handle)来识别,不同窗口的handle值是不一样的
2、窗口的唯一标识用句柄表示,感觉相当于窗口的id
3、在一个浏览器中我们可以打开一个或多个网页窗口,因此WebDriver提供了下面两个属性来获取不同窗口的句柄
⑴获取当前窗口句柄属性:WebDriver对象.current_window_handle
⑵获取所有窗口句柄属性:WebDriver对象.window_handles
1、获取当前窗口句柄属性:WebDriver对象.current_window_handle
2、这里说的"当前"指得是当前Selenium服务实际操作的页面
⑴这里之所以要强调这个"当前"这个词是因为Selenium服务与窗口句柄是有对应关系的
3、一个浏览器中打开多个网页窗口时,我们操作元素,那Selenium怎么知道我们操作的是哪一个网页窗口中的元素呢?
⑴就是通过网页窗口的句柄属性来确定操作哪一个窗口的
⑵首次打开一个页面时Selenium默认使用的是通过WebDriver对象的get()方法打开的网页窗口的句柄
⑶因此若我们要操作其他网页窗口中的元素,就需要先切换窗口句柄,让Selenium知道我们想操作哪一个窗口了
⑷至于如何切换窗口句柄,后面介绍
例6:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_window_handle) # 打印当前窗口句柄
# 通过非get()方法打开网页
driver.execute_script("window.open('http://news.baidu.com/')")
print(driver.current_window_handle) # 打印当前窗口句柄
"""
# 可以看到,当前窗口句柄始终是第一个,也就是通过get()方法打开的那个网页窗口的句柄
CDwindow-D505DD1C725A3320D9BC6A57E7A89D44
CDwindow-D505DD1C725A3320D9BC6A57E7A89D44
"""
1、获取所有窗口句柄属性:WebDriver对象.window_handles
2、该方法返回值为一个列表
例7:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_window_handle) # 打印当前窗口
driver.execute_script("window.open('http://news.baidu.com/')")
print(driver.window_handles) # 打印当前所有窗口
"""
CDwindow-435E56AB539B6AADD83844A7F1CD8F74
['CDwindow-435E56AB539B6AADD83844A7F1CD8F74', 'CDwindow-758F77EB0D73C33432684A22BD60406F']
"""
1、在页面操作过程中有时候点击某一个链接后会弹出新的窗口(进入新的网页窗口),这时候就需要将Selenium主机(相当于指针)切换到新打开的窗口。这样才能够在新打开的窗口上进行操作
⑴点击某一个链接后,打开了一个新的网页窗口(不是在原来的窗口上刷新的)
⑵此时如果我们操作新打开的网页上的元素,肯定是找不到这个元素的
①因为此时Selenium服务还是指向原来的窗口(get方法打开的窗口),而要操作的元素是位于新打开的窗口(元素都不在同一个页面上)
⑶所以,操作元素之前,必须将Selenium服务指向新的网页窗口。这样才能操作新窗口上的元素
2、所以在进行元素定位时,一定要确定好我们操作的是哪一个网页窗口(句柄),当前Selenium指向的又是哪一个网页窗口(句柄),它们两者是否是对应起来的
3、WebDriver提供了对应的方法来实现不同窗口之间的切换,窗口切换是根据窗口的句柄属性来实现的
⑴WebDriver对象.switch_to_window(window_name)
例8:写法1
from selenium import webdriver
import time
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 定位登录按钮点击:
driver.find_element_by_id("s-top-loginbtn").click()
# 定位立即注册按钮并点击
time.sleep(2)
driver.find_element_by_id('TANGRAM__PSP_11__regLink').click()
# 获取当前所有已打开窗口的句柄
currentAllHandles = driver.window_handles
print("当前所有已打开的窗口句柄为:",currentAllHandles)
# 通过列表索引找出我们需要的窗口句柄并切换
driver.switch_to_window(currentAllHandles[1])
# 切换句柄后,在新打开的窗口中进行操作
driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("不怕猫的耗子A")
"""
当前所有已打开的窗口句柄为: ['CDwindow-93982CAFAE0115DDBBFA7EFF74D22BF0', 'CDwindow-6A2FEF7C9C71C5CD2558281DA99105A3']
"""
注:
1、window_handles()方法返回的是一个列表,因此可以使用列表方法(索引)来找到我们需要的窗口句柄并切换
2、window_handles()返回的列表中的元素顺序与窗口顺序是一样的
3、在编辑器里面写switch_to_window()函数时,会发现其名字上多了一条横线(删除线),这个表示该方法过老了,后面可能不支持了
⑴这里可以使用switch_to.window()方法。这两个是一样的
例9:写法2
from selenium import webdriver
import time
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 获取当前窗口的句柄
currentHandle = driver.current_window_handle
print("当前窗口句柄为:",currentHandle)
# 定位登录按钮点击:
driver.find_element_by_id("s-top-loginbtn").click()
# 定位立即注册按钮并点击
time.sleep(2)
driver.find_element_by_id('TANGRAM__PSP_11__regLink').click()
# 获取当前所有已打开窗口的句柄
currentAllHandles = driver.window_handles
print("当前所有已打开的窗口句柄为:",currentAllHandles)
# 遍历当前所有已打开窗口的句柄
for currentAllHandle in currentAllHandles:
# 若当前句柄不为首页句柄,那么就表示为注册窗口句柄
if currentAllHandle != currentHandle:
# 这里使用新写法
driver.switch_to.window(currentAllHandle)
else:
pass
# 切换句柄后,在新打开的窗口中进行操作
driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("不怕猫的耗子A")
"""
当前窗口句柄为: CDwindow-E1C4ABB8D449B77832BAA1F265CBB46A
当前所有已打开的窗口句柄为: ['CDwindow-E1C4ABB8D449B77832BAA1F265CBB46A', 'CDwindow-65466695993B64558A91CC480C58CA04']
注:
这种写法不是很好,局限性有很多
上面只打开了两个网页窗口,通过获取当前全部窗口句柄,然后遍历判断是否为默认句柄(get()方法打开的网页)
如果不为默认句柄,那么就一定是我们需要切换到的那个句柄了
若打开了三个或三个以上网页窗口,还使用这种方法来的话就不得行了
因为我们只能获取到默认窗口的句柄,此时就会有两个窗口的句柄与默认窗口句柄不相等了,这样依旧无法判断哪一个句柄是我们所需要的
所以这种方法了解下就好了
"""
注:
1、上面例子中提到了几个方法
⑴click():表示点击按钮操作
⑵send_keys():表示向输入框中输入字符操作
⑶time.sleep():等待操作
2、之所以需要执行time.sleep(),因为网页加载是需要一定时间的,有可能网页元素还没加载出来,我们的代码就执行了
⑴这样就会造成实际存在的元素,但由于没加载出来就找不到了或者操作不了了,因此需要我们等待下,等元素加载出来再继续定位或操作
⑵记住:如果确定定位方式是写对了的,但是就是找不到元素,一定要先试试等待几秒钟
1、WebDriver对象提供获取当前窗口URL的功能:WebDriver对象.current_url
2、该属性返回的是当前Selenium服务所指向的窗口(句柄)的URL
例10:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 进入百度新闻页
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
# 获取当前窗口URL
currentUrl = driver.current_url
print("当前URL为:",currentUrl)
"""
可以看到:我们打开了两个网页窗口,没有进行窗口切换,此时Selenium服务指向的是默认窗口(get方法打开的窗口)
因此返回的是首页的URL
当前URL为: https://www.baidu.com/
"""
1、网页的标题指的是HTML网页中title标签内的内容:head->title
2、可通过WebDriver对象下的title属性获取该值
3、该属性返回的是当前Selenium服务所指向的窗口(句柄)的标题
例11:
from selenium import webdriver
import time
# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 获取网页title
title = driver.title
print(title)
#百度一下,你就知道
1、WebDriver对象提供了获取当前网页源码的功能:WebDriver对象.page_source
2、该方法获取的网页是当前Selenium服务所指向的窗口(句柄)的源码
例12:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 进入百度新闻页
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
# 获取当前窗口URL
currentSource = driver.page_source
print(type(currentSource))
# 将源码写入文件
with open("./baidu.html","w",encoding="utf-8") as file:
file.write(currentSource)
"""
"""
1、WebDriver对象提供网页截图的功能:WebDriver对象.get_screenshot_as_file(path)
2、path参数表示:截图所保存的路径
3、该方法截取的页面是当前Selenium服务所指向的窗口(句柄)
例13:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 进入百度新闻页
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
# 截取当前页面
image = driver.get_screenshot_as_file("./baidu.png")
print(image)
"""
可以看到:我们打开了两个网页窗口,没有进行窗口切换,此时Selenium服务指向的是默认窗口(get方法打开的窗口)
因此截取的是首页的
成功截图后,该函数返回值为True
"""
1、一般来说在完成测试后都需要关闭浏览器,方便后面继续执行测试
2、WebDriver对象提供了两种方式来关闭浏览器网页
⑴WebDriver对象.quit()
⑵WebDriver对象.close()
1、close()方法表示:关闭当前的窗口
⑴"当前窗口"指的就是当前Selenium服务所指向的窗口(句柄)
2、主要应用于,有多个窗口时,关闭其中某个窗口,继续执行其他窗口
例14:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 进入百度新闻页
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
# 获取当前所有窗口句柄
currentAllHandles = driver.window_handles
print("未关闭窗口前的句柄:",currentAllHandles)
# 将Selenium服务指向的句柄切换至新闻页
driver.switch_to_window(currentAllHandles[1])
# 关闭当前句柄
driver.close()
# 再次获取当前所有窗口句柄
currentAllHandles = driver.window_handles
print("关闭窗口后的句柄:",currentAllHandles)
"""
未关闭窗口前的句柄: ['CDwindow-24B70A7F20F43B15D9A32641FDEFF3E8', 'CDwindow-78FAB4520559C9E8D78D29D970E984F2']
关闭窗口后的句柄: ['CDwindow-24B70A7F20F43B15D9A32641FDEFF3E8']
可以看到close()方法只关闭了指定的窗口,不会关闭整个浏览器
"""
1、quit()方法表示:关闭整个浏览器
2、如果浏览器有多个窗口,会同时关闭所有窗口(整个浏览器),不再做其他窗口操作
3、如果彻底完成网页操作(完成测试)后,建议使用该方法来关闭整个浏览器
例15:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 进入百度首页
driver.get('https://www.baidu.com/')
# 进入百度新闻页
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
# 关闭整个浏览器
driver.quit()