在页面自动化中,定位下拉框筛选项是避免不了的,下面就给大家介绍几个定位不同下拉框的方法
第一种:鼠标悬停下拉框(以百度新闻为例)

思路:先找到设置这两个字符;然后把鼠标悬停在设置这个字符上,弹出下拉选项;然后在弹出的下拉框中点击选择某一个选项;
方法:使用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") #切换成按时间排序
网友评论