1. 程式人生 > 實用技巧 >00019.01 資料結構:物理結構與邏輯結構(-----)

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()
# 新增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")