00019.01 資料結構:物理結構與邏輯結構(-----)
date: 2018-12-14 08:47:49
updated: 2018-12-14 13:14:22
Selenium
1.配置環境
1.1 安裝selenium
pip install selenium
1.2 安裝webdriver
安裝Chrome的webdriver外掛
https://sites.google.com/a/chromium.org/chromedriver/downloads
下載完成之後將 .exe 檔案放入到Chrome的安裝目錄,預設安裝路徑是C:\Program Files (x86)\Google\Chrome
,所以複製到C:\Program Files (x86)\Google\Chrome\Application
1.3 測試
def open_page():
browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
browser.get('http://www.baidu.com/')
2.Demo:QQMail
def open_QQmail(): driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe") driver.get('https://mail.qq.com/') # 開啟QQ郵箱首頁 time.sleep(3) # 等待頁面載入 # 切換iframe # selenium只能在一個頁面中尋找元素,對於iframe嵌入的頁面需要跳轉到對應的iframe才能繼續操作 login_frame = driver.find_element_by_name("login_frame") driver.switch_to_frame(login_frame) # 如果已經登入了QQ,那麼就需要加上下面這行程式碼,用於切換到賬號密碼登入 driver.find_element_by_id("switcher_plogin").click() driver.find_element_by_name("u").clear() # 先清空對應文字框的內容 driver.find_element_by_name("u").send_keys("QQ號") # 輸入文字 driver.find_element_by_name("p").clear() driver.find_element_by_name("p").send_keys("QQ密碼") driver.find_element_by_id("login_button").click() # 點選登入按鈕 time.sleep(15) # 等待是為了觀察頁面是否正確跳轉 print(driver.current_url) # 列印跳轉後的頁面url,如果等待時間過短,此時驅動可能還沒有完全跳轉,打印出來的 current_url 還是 'https://mail.qq.com/' driver.close() # 關閉一個標籤頁,對於 Chrome 來說,關閉唯一一個標籤頁瀏覽器也會關閉,但是 Firefox 和 Opera 不會關閉瀏覽器 # driver.quit() # 關閉Chrome瀏覽器
3.頁面互動
3.1 提交表單
driver.find_element_by_id("id").submit()
3.2 下拉列表
# 先獲取 select 下拉框,然後遍歷其中的 option # 效率較低 element = driver.find_element_by_xpath("//select[@name='name']") all_options = element.find_elements_by_tag_name("option") for option in all_options: print("Value is: %s" % option.get_attribute("value")) option.click() # 獲取 select 下拉框,通過 option 的下標、文字、值來進行選擇 from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value) # 取消選擇 select = Select(driver.find_element_by_id('id')) select.deselect_all() # 獲取所有已選的選項 select = Select(driver.find_element_by_xpath("xpath")) all_selected_options = select.all_selected_options # 獲取所有可選的選項 options = select.options
3.3 元素拖拽
# 先指定被拖動的元素(Source)和拖動目標元素(Target)
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
3.4 頁面切換
# 切換視窗
driver.switch_to_window("windowName")
# 獲取每個視窗的操作物件
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 切換iframe
driver.switch_to_frame("iframeName")
# 通過“.”操作符你還可以獲得子frame,並通過下標指定任意frame
driver.switch_to_frame("frameName.0.child")
# 返回父frame
driver.switch_to_default_content()
3.5 彈窗處理
# 獲取頁面出現了彈窗提示
alert = driver.switch_to_alert()
3.6 歷史記錄
driver.forward()
driver.back()
3.7 cookie
# 新增cookie
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# 獲取cookie
driver.get_cookies()
4.元素獲取
4.1 單個元素獲取
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
4.2 多個元素獲取
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
5.頁面等待
現在的網頁越來越多采用了 Ajax 技術,這樣程式便不能確定何時某個元素完全加載出來了。這會讓元素定位困難而且會提高產生 ElementNotVisibleException 的概率。
所以 Selenium 提供了兩種等待方式,一種是隱式等待,一種是顯式等待。隱式等待是等待特定的時間,顯式等待是指定某一條件直到條件完成時才繼續執行。
5.1 顯式等待
顯式等待指定某個條件,然後設定最長等待時間。如果在這個時間還沒有找到元素,那麼便會丟擲異常了。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "id"))
)
finally:
driver.quit()
程式預設會 500ms 呼叫一次來檢視元素是否已經生成,如果本來元素就是存在的,那麼會立即返回。
下面是一些內建的等待條件,你可以直接呼叫這些條件,而不用自己寫某些等待條件了。
title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present
5.2 隱式等待
# 預設等待時間是0秒,一旦設定該值,隱式等待是設定該WebDriver的例項的生命週期。
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("id")