網頁元件的定位
定位網頁元件有許多方法，webdriver提供下列方式，
• id
• name
• class name
• link text
• partial link text
• tag name
• xpath
• css selector
我們用 Google為例子說明，如何定位到 Google Search input text
Locator in Google
from selenium import webdriver
from time import sleep
import os


dr = webdriver.Firefox()
url = 'http://www.google.com'
dr.get(url)
 
# by id

dr.find_element_by_id('lst-ib').click()

# by name

dr.find_element_by_name('q').click()


# by class_name

dr.find_element_by_class_name('gsfi')

# by link text 
#(Google的例子不適用。因為這個Search Input Text沒有 link上的文字。)

link = dr.find_element_by_link_text('register')
dr.execute_script('$(arguments[0]).fadeOut().fadeIn()', link)
sleep(1)

# by xpath

dr.find_element_by_xpath('//*[@name='q']')

dr.quit()

檔案下載
檔案下載最大的問題在於出現的視窗是 Selenium無法處理。
因此，實作上，我們會先設定 FireFox profile將存檔的位置設定好，避免在執行過程中出現存檔的視窗。
browser = webdriver.Firefox(firefox_profile=fp)

import os
from selenium import webdriver

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")

browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()

等待網頁元件出現
例如這個例子，等待10秒特定網頁元件的出現。
為什麼不使用 sleep(10) ? sleep (10)固定一定會等待10秒。
而WebDriverWait，比較像是 timeout的設定。
# -*- coding: utf-8 -*- 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
import os
import selenium.webdriver.support.ui as ui

dr = webdriver.Firefox()
url = 'http://www.google.com'
dr.get(url)
 
wait = ui.WebDriverWait(dr, 10)
wait.until(lambda dr: dr.find_element_by_name('q').is_displayed())

dr.quit()

FORM元件的操作
網頁的 FORM有 checkBox, Radio, Selection, Alert等，相關的處理範例如下：
# -*- coding: utf-8 -*- 

from selenium import webdriver
from time import sleep
import os

dr = webdriver.Firefox()
url = 'http://www.google.com'
dr.get(url)
 
# checkbox
dr.find_element_by_css_selector('input[type=checkbox]').click()

# radio
dr.find_element_by_css_selector('input[type=radio]').click()

# Options
dr.find_element_by_tag_name('select').find_elements_by_tag_name('option')[-1].click()
sleep(1)

# Alert的處理
alert = dr.switch_to_alert()
print alert.text
alert.accept()

dr.quit()

鍵盤的輸入
例如 Google Search的輸入
dr.find_element_by_name('q').send_keys("Google Search")

網頁元件的屬性特殊按鍵像是 copy & Paste 的行為
# copy content of A

dr.find_element_by_id('A').send_keys((Keys.CONTROL, 'a'))
dr.find_element_by_id('A').send_keys((Keys.CONTROL, 'x'))

網頁元件屬性
我們可以根據取得網頁元件屬形做基本的驗證或是判斷進一步的處理。
• text_field = dr.find_element_by_name('user')
• print text_field.is_enabled()
• print text_field.is_displayed()
如果是 Radio，可以判斷是否被選取
• radio = dr.find_element_by_name(‘radio‘)
• print radio.is_selected()
