主要參考蟲師的博客,他的文章里面講得比較簡單,有一些情況沒有考慮到,在這里做個筆記。
在蟲師的博客中講了如何在一個給定的網頁去定位元素,但是如果在實際操作中,需要由一個頁面跳轉到另一個頁面時,就需要頁面之間的切換了。
1. switch_to_window()
這個方法在蟲師的博客中講得不是很詳細,我主要參考的是 http://blog.csdn.net/hhabc123456789/article/details/21862139
直接上一個我用來測試的例子吧。
#coding=utf-8 import os from selenium import webdriver import time chrome = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' os.environ["webdriver.chrome.driver"] = chrome driver = webdriver.Chrome(chrome) driver.get('http://www.baidu.com') #獲取當前窗口的句柄 currentWin = driver.current_window_handle #跳轉到另一個新頁面 driver.find_element_by_xpath("//p[@id='nv']/a[3]").click() time.sleep(1) #獲取所有窗口的句柄 handles = driver.window_handles for i in handles: if currentWin == i: continue else: #將driver與新的頁面綁定起來 driver = driver.switch_to_window(i) #在新的頁面定位元素 driver.find_element_by_xpath("//div[@id='menu']/a[1]").click() time.sleep(2) driver.quit()
應該比較清晰了,注釋里面都解釋了。
補充一下:我本來以為只要網頁的url改變了,driver就需要更新。后來發現driver真的是對應到一個特定的窗口的。不論url如何更新,只要沒有新的“標簽頁”出現(html的實現上就是target="_blank"這種形式的),driver就不用更新,也就用不到這里的switch_to_window()的方法了。
2. switch_to_frame()
這個方法蟲師將得比較清楚,可以參考這里的例子,只是有一個問題需要注意。如下代碼
#coding=utf-8 from selenium import webdriver import time import os browser = webdriver.Firefox() file_path = 'file:///' + os.path.abspath('frame.html') browser.get(file_path) browser.implicitly_wait(30) #先找到到ifrome1(id = f1) ##############一定要先定位frame1,才能找得到fram2############################### browser.switch_to_frame("f1") #再找到其下面的ifrome2(id =f2) browser.switch_to_frame("f2") #下面就可以正常的操作元素了 browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() time.sleep(3) browser.quit()
如注釋里面說明的,如果frame有嵌套的話,必須一層一層的找。否則會報錯。
如上
Bon Appetite!