在頁(yè)面自動(dòng)化中,定位下拉框篩選項(xiàng)是避免不了的练对,下面就給大家介紹幾個(gè)定位不同下拉框的方法
第一種:鼠標(biāo)懸停下拉框(以百度新聞為例)
思路:先找到設(shè)置這兩個(gè)字符遍蟋;然后把鼠標(biāo)懸停在設(shè)置這個(gè)字符上,彈出下拉選項(xiàng)螟凭;然后在彈出的下拉框中點(diǎn)擊選擇某一個(gè)選項(xiàng)虚青;
方法:使用selenium的ActionChains
# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains #導(dǎo)入這個(gè)模塊
browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打開(kāi)百度新聞頁(yè)面
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") #找到設(shè)置這兩個(gè)字符
ActionChains(browser).move_to_element(set_button).perform() #鼠標(biāo)懸停在設(shè)置這兩個(gè)字符上
browser.find_element_by_link_text("高級(jí)搜索").click() #選擇高級(jí)搜索這個(gè)選項(xiàng),并點(diǎn)擊
第二種:普通點(diǎn)擊下拉框(以百度新聞排序?yàn)槔?
思路:先找到排序篩選框螺男;然后鼠標(biāo)點(diǎn)擊篩選框棒厘,彈出下拉選項(xiàng);然后在彈出的下拉框中點(diǎn)擊選擇某一個(gè)選項(xiàng)下隧;
方法:使用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/") #打開(kāi)百度新聞頁(yè)面
time.sleep(1)
browser.find_element_by_link_text("高級(jí)搜索").click() #點(diǎn)擊進(jìn)入高級(jí)檢索頁(yè)面
set_sort=browser.find_element_by_css_selector("select[name='ct1']") #找到這個(gè)排序篩選框
Select(set_sort).select_by_value("0") #切換成按時(shí)間排序
這就完成了奢人,so easy,但是你有沒(méi)想過(guò)淆院,如果是新的窗口頁(yè)面里面的某個(gè)下拉框何乎,改方法是否也適用呢,答案是不,那怎么辦呢支救,接下來(lái)繼續(xù)講解:
這里面抢野,我們需要了解selenium的一個(gè)術(shù)語(yǔ):句柄;
句柄各墨,就是當(dāng)前瀏覽器每個(gè)窗口的標(biāo)識(shí)符指孤,每個(gè)窗口的句柄具有唯一性;
接下來(lái)先做一個(gè)小實(shí)驗(yàn)贬堵,證明一下為啥需要用到句柄:
還是以百度新聞為例:
-*- coding:utf-8 -*-
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打開(kāi)百度新聞頁(yè)面
time.sleep(1)
handles = browser.window_handles #獲取所有窗口的句柄
print("當(dāng)前窗口的句柄",handles ) #這里輸出所有窗口的句柄恃轩,當(dāng)前只有一個(gè)窗口,所以輸出的是當(dāng)前窗口的句柄
browser.find_element_by_link_text("百度新聞客戶端").click() #在百度新聞頁(yè)面基礎(chǔ)上(新窗口)打開(kāi)百度新聞客戶端頁(yè)面
handles = browser.window_handles #獲取所有窗口的句柄
print("全部窗口的句柄",handles ) #這里會(huì)輸出兩個(gè)句柄信息黎做,以list的方式返回
到這里详恼,我們?cè)趺粗喇?dāng)前標(biāo)記的是哪個(gè)窗口的句柄呢(就是讀取哪個(gè)窗口的代碼)?我們可以關(guān)閉一個(gè)窗口引几,如果某個(gè)窗口被關(guān)閉了昧互,那就證明標(biāo)記的是哪個(gè)窗口的句柄,在后面增加下面這行代碼
browser.close() #關(guān)閉當(dāng)前標(biāo)識(shí)的窗口
handles = browser.window_handles #獲取所有窗口的句柄
print("全部窗口的句柄",handles )
我們會(huì)發(fā)現(xiàn)就算打開(kāi)了新的窗口伟桅,并在頁(yè)面上跳轉(zhuǎn)到新的窗口敞掘,但是關(guān)閉的窗口仍然是最初始的窗口,所以這就證明由始至終都是標(biāo)識(shí)第一個(gè)窗口的句柄楣铁,那我們就要在進(jìn)行后面一系列操作之前玖雁,先標(biāo)識(shí)到新窗口的句柄
還是以百度新聞的排序篩選框?yàn)槔Y(jié)合懸停下拉框
# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains #導(dǎo)入這個(gè)模塊
browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打開(kāi)百度新聞頁(yè)面
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") #找到設(shè)置這兩個(gè)字符
ActionChains(browser).move_to_element(set_button).perform() #鼠標(biāo)懸停在設(shè)置這兩個(gè)字符上
browser.find_element_by_link_text("高級(jí)搜索").click() #選擇高級(jí)搜索這個(gè)選項(xiàng)盖腕,并點(diǎn)擊
handles = browser.window_handles #獲取所有窗口的句柄
browser.switch_to.window(handles[1]) #切換到新窗口的句柄赫冬,從0開(kāi)始,第一個(gè)窗口就是0溃列,第二個(gè)(新)窗口就是1劲厌,以此類推
set_sort=browser.find_element_by_css_selector("select[name='ct1']") #找到這個(gè)排序篩選框
Select(set_sort).select_by_value("0") #切換成按時(shí)間排序