Selenium:浏览器操作

Selenium浏览器操作

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(),因为网页加载是需要一定时间的,有可能网页元素还没加载出来,我们的代码就执行了
    ⑴这样就会造成实际存在的元素,但由于没加载出来就找不到了或者操作不了了,因此需要我们等待下,等元素加载出来再继续定位或操作
    ⑵记住:如果确定定位方式是写对了的,但是就是找不到元素,一定要先试试等待几秒钟

获取当前窗口URL

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


 

你可能感兴趣的:(Selenium,python,chrome,前端)