Python+Selenium詳解(超全)
一、Selenium+Python環境搭建及配置
1。1 selenium 介紹
selenium 是一個 web 的自動化測試工具,不少學習功能自動化的同學開始首選 selenium ,因為它相比 QTP 有諸多有點:
免費,也不用再為破解 QTP 而大傷腦筋
小巧,對於不同的語言它只是一個包而已,而 QTP 需要下載安裝1個多 G 的程式。
這也是最重要的一點,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以透過 selenium 完成自動化測試,而 QTP 只支援 VBS
支援多平臺:windows、linux、MAC ,支援多瀏覽器:ie、ff、safari、opera、chrome
支援分散式測試用例的執行,可以把測試用例分佈到不同的測試機器的執行,相當於分發機的功能。
1。2 selenium+Python環境配置
前提條件:已安裝好Python開發環境(推薦安裝Python3。5及以上版本)
安裝步驟:
安裝selenium
Win:pip install selenium
Mac:pip3 install selenium
安裝webdriver
注:webdriver需要和對應的瀏覽器版本以及selenium版本對應
webdriver安裝路徑
Win:複製webdriver到Python安裝目錄下
Mac:複製webdriver到/usr/local/bin目錄下
二、元素定位及瀏覽器基本操作
2。1 啟動瀏覽器
2。1。1 普通方式啟動
啟動Chrome瀏覽器:
from selenium import webdriver
browser = webdriver。Chrome()
browser。get(‘URL’)
啟動Firefox瀏覽器:
from selenium import webdriver
browser = webdriver。Firefox()
browser。get(‘URL’)
啟動IE瀏覽器:
from selenium import webdriver
browser = webdriver。Ie()
browser。get(‘URL’)
2。1。2 Headless方式啟動
Headless Chrome 是 Chrome 瀏覽器的無介面形態,可以在不開啟瀏覽器的前提下,使用所有 Chrome 支援的特性執行你的程式。相比於現代瀏覽器,Headless Chrome 更加方便測試 web 應用,獲得網站的截圖,做爬蟲抓取資訊等。相比於較早的 PhantomJS,SlimerJS 等,Headless Chrome 則更加貼近瀏覽器環境。
Headless Chrome 對Chrome版本要求:
官方文件中介紹,mac和linux環境要求chrome版本是59+,而windows版本的chrome要求是60+,同時chromedriver要求2。30+版本。
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
from selenium。webdriver。common。action_chains import ActionChains
from selenium。webdriver。common。keys import Keys
chrome_options = webdriver。ChromeOptions()
# 使用headless無介面瀏覽器模式
chrome_options。add_argument(‘——headless’) //增加無介面選項
chrome_options。add_argument(‘——disable-gpu’) //如果不加這個選項,有時定位會出現問題
# 啟動瀏覽器,獲取網頁原始碼
browser = webdriver。Chrome(chrome_options=chrome_options)
mainUrl = “URL”
browser。get(mainUrl)
print(f“browser text = {browser。page_source}”)
browser。quit()
2。1。3 載入配置啟動瀏覽器
Selenium操作瀏覽器是不載入任何配置的,下面是關於載入Chrome配置的方法:
用Chrome位址列輸入chrome://version/,檢視自己的“個人資料路徑”,然後在瀏覽器啟動時,呼叫這個配置檔案,程式碼如下:
#coding=utf-8
from selenium import webdriver
option = webdriver。ChromeOptions()
option。add_argument(‘——user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data’) #設定成使用者自己的資料目錄
driver=webdriver。Chrome(chrome_options=option)
而載入Firefox配置的方法有些不同:
開啟Firefox點右上角設定>?(幫助)>故障排除資訊>顯示資料夾,開啟後把路徑複製下來就可以了
# coding=utf-8
from selenium import webdriver
# 配置檔案地址
profile_directory = r‘C:\Users\\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of。default’
# 載入配置配置
profile = webdriver。FirefoxProfile(profile_directory)
# 啟動瀏覽器配置
driver = webdriver。Firefox(profile)
2。2 元素定位
物件的定位應該是自動化測試的核心,要想操作一個物件,首先應該識別這個物件。一個物件就是一個人一樣,他會有各種的特徵(屬性),如比我們可以透過一個人的身份證號,姓名,或者他住在哪個街道、樓層、門牌找到這個人。那麼一個物件也有類似的屬性,我們可以透過這個屬性找到這物件。
webdriver 提供了一系列的物件定位方法,常用的有以下幾種:
id定位:find_element_by_id()
name定位:find_element_by_name()
class定位:find_element_by_class_name()
link定位:find_element_by_link_text()
partial link定位:find_element_by_partial_link_text()
tag定位:find_element_by_tag_name()
xpath定位:find_element_by_xpath()
css定位:find_element_by_css_selector()
#coding=utf-8
from selenium import webdriver
browser=webdriver。Firefox()
browser。get(“URL”)
#透過id方式定位
browser。find_element_by_id(“kw”)。send_keys(“selenium”)
#透過name方式定位
browser。find_element_by_name(“wd”)。send_keys(“selenium”)
#透過tag name方式定位
browser。find_element_by_tag_name(“input”)。send_keys(“selenium”)
#透過class name方式定位
browser。find_element_by_class_name(“s_ipt”)。send_keys(“selenium”)
#透過CSS方式定位
browser。find_element_by_css_selector(“#kw”)。send_keys(“selenium”)
#透過xpath方式定位
browser。find_element_by_xpath(“//input[@id=‘kw’]”)。send_keys(“selenium”)
browser。find_element_by_id(“su”)。click()
time。sleep(3)
browser。quit()
2。2。1 class含有空格時解決方法:
在實際進行元素定位時,經常發現class name是有多個class組合的複合類,中間以空格隔開。如果直接進行定位會出現報錯,可以透過以下方式處理:
class屬性唯一但是有空格,選擇空格兩邊唯一的那一個
若空格隔開的class不唯一可以透過索引進行定位
self。driver。find_elements_by_class_name(‘table-dragColumn’)[0]。click()
透過css方法進行定位(空格以‘。’代替)
#前面加(。)空格地方用點(。)來代替
self。driver。find_element_by_css_selector(‘。dtb-style-1。table-dragColumns’)。click()
#包含整個類
self。driver。find_element_by_css_selector(‘class=“dtb-style-1 table-dragColumns’)。click()
參考程式碼:
# coding:utf-8
from selenium import webdriver
driver = webdriver。Firefox()
driver。get(”URL“)
driver。implicitly_wait(20)
driver。switch_to。frame(”x-URS-iframe“)
# 方法一:取單個class屬性
driver。find_element_by_class_name(”dlemail“)。send_keys(”yoyo“)
driver。find_element_by_class_name(”dlpwd“)。send_keys(”12333“)
# 方法二:定位一組取下標定位(乃下策)
driver。find_elements_by_class_name(”j-inputtext“)[0]。send_keys(”yoyo“)
driver。find_elements_by_class_name(”j-inputtext“)[1]。send_keys(”12333“)
# 方法三:css定位
driver。find_element_by_css_selector(”。j-inputtext。dlemail“)。send_keys(”yoyo“)
driver。find_element_by_css_selector(”。j-inputtext。dlpwd“)。send_keys(”123“)
# 方法四:取單個class屬性也是可以的
driver。find_element_by_css_selector(”。dlemail“)。send_keys(”yoyo“)
driver。find_element_by_css_selector(”。dlpwd“)。send_keys(”123“)
# 方法五:直接包含空格的CSS屬性定位大法
driver。find_element_by_css_selector(”[class=‘j-inputtext dlemail’]“)。send_keys(”yoyo“)
2。3 selenium三種等待方式
有時候為了保證指令碼執行的穩定性,需要指令碼中新增等待時間。
2。3。1 強制等待
第一種也是最簡單粗暴的一種辦法就是強制等待sleep(xx),需要引入“time”模組,這種叫強制等待,不管你瀏覽器是否載入完了,程式都得等待3秒,3秒一到,繼續執行下面的程式碼,作為除錯很有用,有時候也可以在程式碼裡這樣等待,不過不建議總用這種等待方式,太死板,嚴重影響程式執行速度。
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
driver = webdriver。Firefox()
driver。get(‘URL’)
time。sleep(3) # 強制等待3秒再執行下一步
print(driver。current_url)
driver。quit()
2。3。2 隱性等待
第二種辦法叫隱性等待,透過新增 implicitly_wait() 方法就可以方便的實現智慧等待;implicitly_wait(30) 的用法應該比 time。sleep() 更智慧,後者只能選擇一個固定的時間的等待,前者可以 在一個時間範圍內智慧的等待。
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver。Firefox()
driver。implicitly_wait(30) # 隱性等待,最長等30秒
driver。get(‘URL’)
print(driver。current_url)
driver。quit()
隱形等待是設定了一個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間截止,然後執行下一步。注意這裡有一個弊端,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步,我想等我要的元素出來之後就下一步怎麼辦?有辦法,這就要看selenium提供的另一種等待方式——顯性等待wait了。
需要特別說明的是:隱性等待對整個driver的週期都起作用,所以只要設定一次即可,我曾看到有人把隱性等待當成了sleep在用,走哪兒都來一下…
2。3。3 顯性等待
第三種辦法就是顯性等待,WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。它主要的意思就是:程式每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設定的最長時間,然後丟擲TimeoutException。
wait模組的WebDriverWait類是顯性等待類,先看下它有哪些引數與方法:
selenium。webdriver。support。wait。WebDriverWait(類)
init
driver: 傳入WebDriver例項,即我們上例中的driver
timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
poll_frequency: 呼叫until或until_not中的方法的間隔時間,預設是0。5秒
ignored_exceptions: 忽略的異常,如果在呼叫until或until_not的過程中丟擲這個元組中的異常,則不中斷程式碼,繼續等待,如果丟擲的是這個元組外的異常,則中斷程式碼,丟擲異常。預設只有NoSuchElementException。
until
method: 在等待期間,每隔一段時間(__init__中的poll_frequency)呼叫這個傳入的方法,直到返回值不是False
message: 如果超時,丟擲TimeoutException,將message傳入異常
until_not
與until相反,until是當某元素出現或什麼條件成立則繼續執行,
until_not是當某元素消失或什麼條件不成立則繼續執行,引數也相同,不再贅述。
看了以上內容基本上很清楚了,呼叫方法如下:
WebDriverWait(driver, 超時時長, 呼叫頻率, 忽略異常)。until(可執行方法, 超時時返回的資訊)
這裡需要特別注意的是until或until_not中的可執行方法method引數,很多人傳入了WebElement物件,如下:
WebDriverWait(driver, 10)。until(driver。find_element_by_id(‘kw’)) # 錯誤
這是錯誤的用法,這裡的引數一定要是可以呼叫的,即這個物件一定有 call() 方法,否則會丟擲異常:
TypeError: ‘xxx’ object is not callable
在這裡,你可以用selenium提供的 expected_conditions 模組中的各種條件,也可以用WebElement的 is_displayed() 、is_enabled()、**is_selected() **方法,或者用自己封裝的方法都可以。
#coding=utf-8
from selenium import webdriver
from selenium。webdriver。common。by import By
from selenium。webdriver。support import expected_conditions as EC
from selenium。webdriver。support。wait import WebDriverWait
base_url = ”URL“
driver = webdriver。Firefox()
driver。implicitly_wait(5)
‘’‘隱式等待和顯示等待都存在時,超時時間取二者中較大的’‘’
locator = (By。ID,‘kw’)
driver。get(base_url)
WebDriverWait(driver,10)。until(EC。title_is(u”百度一下,你就知道“))
‘’‘判斷title,返回布林值’‘’
WebDriverWait(driver,10)。until(EC。title_contains(u”百度一下“))
‘’‘判斷title,返回布林值’‘’
WebDriverWait(driver,10)。until(EC。presence_of_element_located((By。ID,‘kw’)))
‘’‘判斷某個元素是否被加到了dom樹裡,並不代表該元素一定可見,如果定位到就返回WebElement’‘’
WebDriverWait(driver,10)。until(EC。visibility_of_element_located((By。ID,‘su’)))
‘’‘判斷某個元素是否被新增到了dom裡並且可見,可見代表元素可顯示且寬和高都大於0’‘’
WebDriverWait(driver,10)。until(EC。visibility_of(driver。find_element(by=By。ID,value=‘kw’)))
‘’‘判斷元素是否可見,如果可見就返回這個元素’‘’
WebDriverWait(driver,10)。until(EC。presence_of_all_elements_located((By。CSS_SELECTOR,‘。mnav’)))
‘’‘判斷是否至少有1個元素存在於dom樹中,如果定位到就返回列表’‘’
WebDriverWait(driver,10)。until(EC。visibility_of_any_elements_located((By。CSS_SELECTOR,‘。mnav’)))
‘’‘判斷是否至少有一個元素在頁面中可見,如果定位到就返回列表’‘’
WebDriverWait(driver,10)。until(EC。text_to_be_present_in_element((By。XPATH,”//*[@id=‘u1’]/a[8]“),u‘設定’))
‘’‘判斷指定的元素中是否包含了預期的字串,返回布林值’‘’
WebDriverWait(driver,10)。until(EC。text_to_be_present_in_element_value((By。CSS_SELECTOR,‘#su’),u‘百度一下’))
‘’‘判斷指定元素的屬性值中是否包含了預期的字串,返回布林值’‘’
#WebDriverWait(driver,10)。until(EC。frame_to_be_available_and_switch_to_it(locator))
‘’‘判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False’‘’
#注意這裡並沒有一個frame可以切換進去
WebDriverWait(driver,10)。until(EC。invisibility_of_element_located((By。CSS_SELECTOR,‘#swfEveryCookieWrap’)))
‘’‘判斷某個元素在是否存在於dom或不可見,如果可見返回False,不可見返回這個元素’‘’
#注意#swfEveryCookieWrap在此頁面中是一個隱藏的元素
WebDriverWait(driver,10)。until(EC。element_to_be_clickable((By。XPATH,”//*[@id=‘u1’]/a[8]“)))。click()
‘’‘判斷某個元素中是否可見並且是enable的,代表可點選’‘’
driver。find_element_by_xpath(”//*[@id=‘wrapper’]/div[6]/a[1]“)。click()
#WebDriverWait(driver,10)。until(EC。element_to_be_clickable((By。XPATH,”//*[@id=‘wrapper’]/div[6]/a[1]“)))。click()
#WebDriverWait(driver,10)。until(EC。staleness_of(driver。find_element(By。ID,‘su’)))
‘’‘等待某個元素從dom樹中移除’‘’
#這裡沒有找到合適的例子
WebDriverWait(driver,10)。until(EC。element_to_be_selected(driver。find_element(By。XPATH,”//*[@id=‘nr’]/option[1]“)))
‘’‘判斷某個元素是否被選中了,一般用在下拉列表’‘’
WebDriverWait(driver,10)。until(EC。element_selection_state_to_be(driver。find_element(By。XPATH,”//*[@id=‘nr’]/option[1]“),True))
‘’‘判斷某個元素的選中狀態是否符合預期’‘’
WebDriverWait(driver,10)。until(EC。element_located_selection_state_to_be((By。XPATH,”//*[@id=‘nr’]/option[1]“),True))
‘’‘判斷某個元素的選中狀態是否符合預期’‘’
driver。find_element_by_xpath(”。//*[@id=‘gxszButton’]/a[1]“)。click()
instance = WebDriverWait(driver,10)。until(EC。alert_is_present())
‘’‘判斷頁面上是否存在alert,如果有就切換到alert並返回alert的內容’‘’
print instance。text
instance。accept()
driver。close()
2。4 瀏覽器操作
2。4。1 瀏覽器最大化、最小化
將瀏覽器最大化顯示
browser。maximize_window()
將瀏覽器最小化顯示
browser。minimize_window()
2。4。2 瀏覽器設定視窗大小
設定瀏覽器寬480、高800顯示
browser。set_window_size(480, 800)
2。4。3 瀏覽器前進後退
前進
browser。forword()
後退
browser。back()
2。5 操作測試物件
一般來說,webdriver 中比較常用的操作物件的方法有下面幾個:
click——點選物件
send_keys——在物件上模擬按鍵輸入
clear——清除物件的內容,如果可以的話
submit——提交物件的內容,如果可以的話
text——用於獲取元素的文字資訊
2。6 鍵盤事件
要想呼叫鍵盤按鍵操作需要引入 keys 包:from selenium。webdriver。common。keys import Keys透過 send_keys()呼叫按鍵:send_keys(Keys。TAB) # TABsend_keys(Keys。ENTER) # 回車
參考程式碼:
#coding=utf-8
from selenium import webdriver
from selenium。webdriver。common。keys import Keys #需要引入 keys 包
import os,time
driver = webdriver。Firefox()
driver。get(”http://passport。kuaibo。com/login/?referrer=http%3A%2F%2Fwebcloud 。kuaibo。com%2F“)
time。sleep(3)
driver。maximize_window() # 瀏覽器全屏顯示
driver。find_element_by_id(”user_name“)。clear()
driver。find_element_by_id(”user_name“)。send_keys(”fnngj“)
#tab 的定位相相於清除了密碼框的預設提示資訊,等同上面的 clear()
driver。find_element_by_id(”user_name“)。send_keys(Keys。TAB)
time。sleep(3)
driver。find_element_by_id(”user_pwd“)。send_keys(”123456“)
#透過定位密碼框,enter(回車)來代替登陸按鈕
driver。find_element_by_id(”user_pwd“)。send_keys(Keys。ENTER)
#也可定位登陸按鈕,透過 enter(回車)代替 click()
driver。find_element_by_id(”login“)。send_keys(Keys。ENTER)
time。sleep(3)
driver。quit()
鍵盤組合鍵的用法:
#ctrl+a 全選輸入框內容
driver。find_element_by_id(”kw“)。send_keys(Keys。CONTROL,‘a’)
#ctrl+x 剪下輸入框內容
driver。find_element_by_id(”kw“)。send_keys(Keys。CONTROL,‘x’)
2。7 滑鼠事件
滑鼠事件一般包括滑鼠右鍵、雙擊、拖動、移動滑鼠到某個元素上等等。
需要引入ActionChains類。
引入方法:
from selenium。webdriver。common。action_chains import ActionChains
ActionChains 常用方法:
perform() 執行所有ActionChains 中儲存的行為;
context_click() 右擊;
double_click() 雙擊;
drag_and_drop() 拖動;
move_to_element() 滑鼠懸停。
滑鼠雙擊示例:
#定位到要雙擊的元素
qqq =driver。find_element_by_xpath(”xxx“)
#對定位到的元素執行滑鼠雙擊操作
ActionChains(driver)。double_click(qqq)。perform()
滑鼠拖放示例:
#定位元素的原位置
element = driver。find_element_by_name(”source“)
#定位元素要移動到的目標位置
target = driver。find_element_by_name(”target“)
#執行元素的移動操作
ActionChains(driver)。drag_and_drop(element, target)。perform()
2。8 多層框架/層級定位
定位元素過程中經常會遇到找不到元素的問題,出現該問題一般都是以下因素導致:
元素定位方法不對
頁面存在iframe或內嵌視窗
頁面超時
webdriver 提供了一個 switch_to_frame 方法,可以很輕鬆的來解決這個問題。
用法:
#先找到到 ifrome1(id = f1)
browser。switch_to_frame(”f1“)
同樣的,如果是內嵌視窗:
browser。switch_to_window(”f1“)
2。9 Expected Conditions解析
Expected Conditions的使用場景有2種:
直接在斷言中使用
與WebDriverWait配合使用,動態等待頁面上元素出現或者消失
相關方法:
title_is: 判斷當前頁面的title是否精確等於預期
title_contains: 判斷當前頁面的title是否包含預期字串
presence_of_element_located:判斷某個元素是否被加到了dom樹裡,並不代表該元素一定可見
visibility_of_element_located:判斷某個元素是否可見。可見代表元素非隱藏,並且元素的寬和高都不等於0
visibility_of:跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了
presence_of_all_elements_located:判斷是否至少有1個元素存在於dom樹中。舉個例子,如果頁面上有n個元素的class都是‘column-md-3’,那麼只要有1個元素存在,這個方法就返回True
text_to_be_present_in_element:判斷某個元素中的text是否包含了預期的字串
text_to_be_present_in_element_value:判斷某個元素中的value屬性是否包含了預期的字串
frame_to_be_available_and_switch_to_it:判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False
invisibility_of_element_located:判斷某個元素中是否不存在於dom樹或不可見
element_to_be_clickable:判斷某個元素中是否可見並且是enable的,這樣的話才叫clickable
staleness_of:等某個元素從dom樹中移除,注意,這個方法也是返回True或False
element_to_be_selected:判斷某個元素是否被選中了,一般用在下拉列表
element_selection_state_to_be:判斷某個元素的選中狀態是否符合預期
element_located_selection_state_to_be:跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
alert_is_present:判斷頁面上是否存在alert,這是個老問題,很多同學會問到
示例:
判斷title:title_is()、title_contains()
首先匯入expected_conditions模組
由於這個模組名稱比較長,所以為了後續的呼叫方便,重新命名為EC了(有點像資料庫裡面多表查詢時候重新命名)
開啟部落格首頁後判斷title,返回結果是True或False
# coding:utf-8
from selenium import webdriver
from selenium。webdriver。support import expected_conditions as EC
driver = webdriver。Firefox()
driver。get(”URL“)
# 判斷title完全等於
title = EC。title_is(u‘冰封’)
print title(driver)
# 判斷title包含
title1 = EC。title_contains(u‘冰封’)
print title1(driver)
# 另外一種寫法
r1 = EC。title_is(u‘冰封’)(driver)
r2 = EC。title_contains(u‘冰封’)(driver)
print r1
print r2
三、Selenium速查表
3。1 Python Webdriver Exception速查表
webdriver在使用過程中可能會出現各種異常,我們需要了解該異常並知道如何進行異常處理。
異常 描述
WebDriverException 所有webdriver異常的基類,當有異常且不屬於下列異常時丟擲 InvalidSwitchToTargetException 下面兩個異常的父類,當要switch的目標不存在時丟擲 NoSuchFrameException 當你想要用switch_to。frame()切入某個不存在的frame時丟擲 NoSuchWindowException 當你想要用switch_to。window()切入某個不存在的window時丟擲 NoSuchElementException 元素不存在,一般由find_element與find_elements丟擲 NoSuchAttributeException 一般你獲取不存在的元素屬性時丟擲,要注意有些屬性在不同瀏覽器裡是有不同的屬性名的 StaleElementReferenceException 指定的元素過時了,不在現在的DOM樹裡了,可能是被刪除了或者是頁面或iframe重新整理了 UnexpectedAlertPresentException 出現了意料之外的alert,阻礙了指令的執行時丟擲 NoAlertPresentException 你想要獲取alert,但實際沒有alert出現時丟擲 InvalidElementStateException 下面兩個異常的父類,當元素狀態不能進行想要的操作時丟擲 ElementNotVisibleException 元素存在,但是不可見,不可以與之互動 ElementNotSelectableException 當你想要選擇一個不可被選擇的元素時丟擲 InvalidSelectorException 一般當你xpath語法錯誤的時候丟擲這個錯 InvalidCookieDomainException 當你想要在非當前url的域裡新增cookie時丟擲 UnableToSetCookieException 當driver無法新增一個cookie時丟擲 TimeoutException 當一個指令在足夠的時間內沒有完成時丟擲 MoveTargetOutOfBoundsException actions的move操作時丟擲,將目標移動出了window之外 UnexpectedTagNameException 獲取到的元素標籤不符合要求時丟擲,比如例項化Select,你傳入了非select標籤的元素時 ImeNotAvailableException 輸入法不支援的時候丟擲,這裡兩個異常不常見,ime引擎據說是僅用於linux下對中文/日文支援的時候 ImeActivationFailedException 啟用輸入法失敗時丟擲 ErrorInResponseException 不常見,server端出錯時可能會拋 RemoteDriverServerException 不常見,好像是在某些情況下驅動啟動瀏覽器失敗的時候會報這個錯
3。2 Xpath&Css定位方法速查表
描述 Xpath
Css
直接子元素 //div/a div > a
子元素或後代元素 //div//a div a
以id定位 //div[@id=‘idValue’]//a div#idValue a
以class定位 //div[@class=‘classValue’]//a div。classValue a
同級弟弟元素 //ul/li[@class=‘first’]/following- ul>li。first + li 屬性 //form/input[@name=‘username’] form input[name=‘username’] 多個屬性 //input[@name=‘continue’ and input[name=‘continue’][type=‘button
第4個子元素 //ul[@id=’list‘]/li[4] ul#list li:nth-child(4)
第1個子元素 //ul[@id=’list‘]/li[1] ul#list li:first-child
最後1個子元素 //ul[@id=’list‘]/li[last()] ul#list li:last-child
屬性包含某欄位 //div[contains(@title,’Title‘)] div[title*=”Title“]
屬性以某欄位開頭 //input[starts-with(@name,’user‘)] input[name^=”user“]
屬性以某欄位結尾 //input[ends-with(@name,’name‘)] input[name$=”name“]
text中包含某欄位 //div[contains(text(), ’text‘)]
無法定位 元素有某屬性 //div[@title] div[title]
父節點 //div/。。 無法定位
同級哥哥節點 //li/preceding-sibling::div[1] 無法定位