一、頁面元素識別與定位javascript
頁面元素由標籤對組成
標籤有各類屬性
標籤對之間能夠有文本數據
標籤有層級關係css
Webdriver提供了8種元素定位方法,在python中對應的方法爲:html
Id定位:find_element_by_id()
Name定位: find_element_by_name()
Tag定位: find_element_by_tag_name()
Class定位: find_element_by_class_name()
Link_text定位: find_element_by_link_text()
Xpath定位: find_element_by_xpath()
Css_selector定位: find_element_by_css_selector
Link_text定位: find_element_by_link_text()
Partial link定位:find_element_by_partial_link_text()
Partial link定位是對link定位的一種補充,有些文字連接比較長,這個時候咱們能夠取部分文字進行定位,只要是能夠惟一標識便可。好比find_element_by_partial_link_text(「首頁」)java
二、Xpath定位python
XPath在XML文檔中定位元素的語言。selenium 用戶但是使用這種 強大語言在web應用中定位元素。
Xpath定位 find_element_by_xpath()
用Xpath定位百度輸入框與百度搜索按鈕
一、絕對路徑定位(主要用標籤名的層級關係)
Find_element_by_xpath(「/html/body/div/div[2]/div/div/div/form/span/input」)
Find_element_by_xpath(「/html/body/div/div[2]/div/div/div/form/span[2]/input」)web
二、利用元素屬性定位
Find_element_by_xpath(「//input[@id=‘kw’]」)
Find_element_by_xpath(「//input[@id=‘su’]」)
//input 表示當前頁面某個input標籤,[@id=‘kw’]表示這個元素id是kw
Find_element_by_xpath(「//*[@name=‘wd’]」)
Find_element_by_xpath(「//*[@class=‘s_ipt’]」)
若是不想指定標籤名,能夠用星號(*)代替
元素的任何屬性均可以使用,只要能惟一標識
Find_element_by_xpath(「//input[@tupe=‘submit’]」)瀏覽器
三、層級與屬性結合(經過搜索框的父元素下面的子標籤)
find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input")
四、使用邏輯運算符(一個屬性不能惟一區分一個元素,那麼能夠用邏輯運算符鏈接多個屬性來查找)
Find_element_by_xpath(「//input[@id=‘kw’and @class=‘s_ipt’ ]」)
And表示知足倆個條件cookie
三、Css定位ui
# 經過class定位
driver.find_element_by_css_selector(".s_btn")
# 經過id定位
driver.find_element_by_css_selector("#kw")
# 經過標籤名定位
driver.find_element_by_css_selector("input")
# 經過標籤層級關係定位(選擇父元素爲 span 的全部 input元素)
driver.find_element_by_css_selector("span>input")
# 經過屬性定位
driver.find_element_by_css_selector("[type='submit]")
driver.find_element_by_css_selector("[name='kw]")
# 組合定位
driver.find_element_by_css_selector("form.fm>span>input.s_ipt")
driver.find_element_by_css_selector("form#form>span>input#kw")spa
四、瀏覽器基本操做
# 控制瀏覽器窗口大小
# 瀏覽器高400,寬200像素
driver.set_window_size(400,200)
# 瀏覽器最大化
driver.maximize_window()
# 控制瀏覽器後退、前進
driver.back()
driver.forward()
# 模擬瀏覽器刷新
driver.refresh()
# 關閉當前窗口
driver.close()
# 退出驅動關閉全部窗口
driver.quit()
五、鼠標操做
# 與鼠標操做相關方法是封裝在ActionChains類中
# 引入ActionChains類
from selenium.webdriver import ActionChains
# context_click():右擊
# double_click():雙擊
# drag_and_drop():拖動
# move_to_element():鼠標懸停
# perform():執行ActionChains類中存儲的行爲
above = driver.find_element_by_link_text("設置")
# 對定位到的元素執行鼠標懸停操做
ActionChains(driver).move_to_element(above).perform()
六、鍵盤操做
# send_keys(Keys.BACK_SPACE):刪除鍵
# send_keys(Keys.SPACE):空格鍵
# send_keys(Keys.TAB):製表鍵
# send_keys(Keys.ESCAPE):回退鍵
# send_keys(Keys.ENTER):回車鍵
# send_keys(Keys.CONTROL,'a'):全選
# send_keys(Keys.CONTROL,'c'):複製
# send_keys(Keys.CONTROL,'x'):剪切
# send_keys(Keys.CONTROL,'v'):黏貼
# send_keys(Keys.F1):鍵盤F1
driver.find_element_by_id("kw").send_keys("ceshi")
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
七、等待時間
現實:當瀏覽器加載頁面時,頁面上的元素並不會同時被加載, 所以增長了定位元素的困難(ElementNotVisibleException錯誤)。
WebDriver提供了2種類型的等待
顯示等待(WebDriverWait類):使WebDriver等待某個條件成立時繼續執行,不然在達到最大時間長時拋出超出時間異常(TimeoutException)
隱式等待(implicitly_wait):經過必定時長的等待頁面上元素加載完成。若是超出了設置的時間長,元素還未被加載,則拋出異常NoSuchElementException
顯示等待(WebDriverWait類):使WebDriver等待某個條件成立時繼續執行,不然在達到最大時間長時拋出超出時間異常(TimeoutException)
具體格式WebDriver(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
• Driver:瀏覽器驅動
• Timeout:最長超時,默認以秒爲單位
• Poll_frequency:檢測間隔的(步長)時間,默認爲0.5s
• Ignored_exceptions:超時後的異常信息,默認狀況下拋出 NoSuchElementException
• WebDriverWait通常與until()與until_not()方法配合使用。
隱式等待(implicitly_wait):經過必定時長的等待頁面上元素加載完成。若是超出了設置的時間長,元素還未被加載,則拋出異常NoSuchElementException
implicitly_wait單位是秒,設置10秒,並非一個固定的等待時間,不影響腳本的執行速度。其次會等待頁面上的全部元素。若是第6s找到就繼續執行,超過10秒沒找到則拋出異常。
八、文件上傳
文件上傳操做也較常見,上傳功能操做webdriver並無提供對應的方法。
上傳過程通常要打開一個系統的window 窗口,從窗口選擇本地文件添加(問題:如何操做 本地window 窗口)。 上傳本地文件;只要定位上傳按鈕,通send_keys 添加本地文件路徑就能夠了。絕對路徑和 相對路徑均可。
# 文件上傳
# 若上傳的元素是<input type="file" name="file"> 相似這樣的,能夠直接將路徑send_keys到該元素
driver.get("file:///D:/BestTesting/pyStudy/%E8%A2%AB%E6%B5%8Bdemo/uploadfile.html").
driver.find_element_by_name("file").send_keys("C:\\Users\Administrator\Pictures\katyperry.png")
九、表單處理
frame/iframe嵌 套,webdriver 只能在一個頁面 上對元素進行定位。
switch_to.frame()方法進行切換。
# 表單切換
driver.get("file:///D:/BestTesting/pyStudy/%E8%A2%AB%E6%B5%8Bdemo/iframe.html")
iframe = driver.find_element_by_id("iname")
driver.switch_to.frame(iframe)
driver.find_element_by_id("sb_form_q").send_keys("selenium")
driver.find_element_by_id("sb_form_go").click()
# 跳到iframe上一級driver.switch_to.parent_frame()
driver.switch_to.parent_frame()
# 跳到最外層的頁面driver.switch_to.default_content()
# driver.switch_to.default_content()
driver.find_element_by_link_text("baidu").click()
十、警告框
在WebDriver中處理javascript所生成的alert、confirm、prompt十分簡單,具體方法是使用switch_to.alert方法。
alert = driver.switch_to.alert
alert.accept() # 至關於點擊肯定
alert.dismiss() # 至關於點擊取消
alert.text #獲取彈出框裏的文
driver.switch_to_alert()
driver.switch_to.alert
selenium3.7.0中switch_to_alert()方法雖然被「畫了橫槓」,可是能夠正常使用!
十一、下拉框處理
# 導入select類
from selenium.webdriver.support.select import Select
# select_by_value()經過value值定位下拉框選項
# select_by_visible_text()經過text值定位下拉選項
# select_by_index()經過下拉選項索引來定位。0,1
# 定位到下拉框
driver.get("file:///D:/BestTesting/pyStudy/被測demo/select.html")
sel =driver.find_element_by_name("select")
Select(sel).select_by_value("1")
# Select(sel).select_by_visible_text("蘋果")
# Select(sel).select_by_index("1")
十二、窗口截圖
# 窗口截圖
driver.get("http://www.baidu.com")
# 截取當前窗口,指定圖片保存位置
driver.save_screenshot("C:\\Users\\Administrator\\Pictures\\test.png")
1三、操做cookies
1四、調用JS操做滾動條