Selenium-处理各种下拉框问题

在页面自动化中,定位下拉框筛选项是避免不了的,下面就给大家介绍几个定位不同下拉框的方法

第一种:鼠标悬停下拉框(以百度新闻为例)


思路:先找到设置这两个字符;然后把鼠标悬停在设置这个字符上,弹出下拉选项;然后在弹出的下拉框中点击选择某一个选项;
方法:使用selenium的ActionChains

# -*- coding:utf-8 -*- 
import time
from selenium import webdriver
from selenium.webdriver import ActionChains #导入这个模块

browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打开百度新闻页面
time.sleep(1)
browser.find_element_by_id("ww").send_keys("广州")
browser.find_element_by_class_name("btn").click()
time.sleep(3)
set_button=browser.find_element_by_class_name("search_set") #找到设置这两个字符
ActionChains(browser).move_to_element(set_button).perform() #鼠标悬停在设置这两个字符上
browser.find_element_by_link_text("高级搜索").click() #选择高级搜索这个选项,并点击

第二种:普通点击下拉框(以百度新闻排序为例)



思路:先找到排序筛选框;然后鼠标点击筛选框,弹出下拉选项;然后在弹出的下拉框中点击选择某一个选项;
方法:使用selenium的Select


# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select

browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打开百度新闻页面
time.sleep(1)
browser.find_element_by_link_text("高级搜索").click() #点击进入高级检索页面
set_sort=browser.find_element_by_css_selector("select[name='ct1']") #找到这个排序筛选框
Select(set_sort).select_by_value("0") #切换成按时间排序

这就完成了,so easy,但是你有没想过,如果是新的窗口页面里面的某个下拉框,改方法是否也适用呢,答案是不,那怎么办呢,接下来继续讲解:

这里面,我们需要了解selenium的一个术语:句柄;
句柄,就是当前浏览器每个窗口的标识符,每个窗口的句柄具有唯一性;
接下来先做一个小实验,证明一下为啥需要用到句柄:

还是以百度新闻为例:



 -*- coding:utf-8 -*-
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打开百度新闻页面
time.sleep(1)
handles = browser.window_handles #获取所有窗口的句柄
print("当前窗口的句柄",handles )  #这里输出所有窗口的句柄,当前只有一个窗口,所以输出的是当前窗口的句柄
browser.find_element_by_link_text("百度新闻客户端").click() #在百度新闻页面基础上(新窗口)打开百度新闻客户端页面
handles = browser.window_handles #获取所有窗口的句柄
print("全部窗口的句柄",handles ) #这里会输出两个句柄信息,以list的方式返回

到这里,我们怎么知道当前标记的是哪个窗口的句柄呢(就是读取哪个窗口的代码)?我们可以关闭一个窗口,如果某个窗口被关闭了,那就证明标记的是哪个窗口的句柄,在后面增加下面这行代码

browser.close() #关闭当前标识的窗口
handles = browser.window_handles #获取所有窗口的句柄
print("全部窗口的句柄",handles )

我们会发现就算打开了新的窗口,并在页面上跳转到新的窗口,但是关闭的窗口仍然是最初始的窗口,所以这就证明由始至终都是标识第一个窗口的句柄,那我们就要在进行后面一系列操作之前,先标识到新窗口的句柄

还是以百度新闻的排序筛选框为例,结合悬停下拉框

# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains #导入这个模块

browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打开百度新闻页面
time.sleep(1)
browser.find_element_by_id("ww").send_keys("广州")
browser.find_element_by_class_name("btn").click()
time.sleep(3)
set_button=browser.find_element_by_class_name("search_set") #找到设置这两个字符
ActionChains(browser).move_to_element(set_button).perform() #鼠标悬停在设置这两个字符上
browser.find_element_by_link_text("高级搜索").click() #选择高级搜索这个选项,并点击
handles = browser.window_handles #获取所有窗口的句柄
browser.switch_to.window(handles[1]) #切换到新窗口的句柄,从0开始,第一个窗口就是0,第二个(新)窗口就是1,以此类推
set_sort=browser.find_element_by_css_selector("select[name='ct1']") #找到这个排序筛选框
Select(set_sort).select_by_value("0") #切换成按时间排序
这样子,我们就可以在新窗口进行一系列的操作啦,当然,切换窗口,也可以使用重定向的方式,关注我,后续再介绍哈!!!

你可能感兴趣的:(Selenium-处理各种下拉框问题)