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/。。 無法定位

Python+Selenium詳解(超全)

Python+Selenium詳解(超全)

Python+Selenium詳解(超全)

同級哥哥節點 //li/preceding-sibling::div[1] 無法定位