前言
相信搞過Python的人絕大部分都會一點點爬蟲技能,但是很多時候爬蟲也不是萬能的,這個時候就需要我們的自動化測試框架了,於是Selenium就應運而生了,它可以算的上是自動化測試框架中的佼佼者,因為它解決了大多數用來爬取頁面的模塊的一個永遠的痛,那就是Ajax異步加載,今天小編就帶大家來好好了解下這個Selenium 。
一、安裝與導入
這里我們需要安裝三個東西,一個是Selenium框架,還有一個瀏覽器,最后就是驅動。這里小編選擇了谷歌瀏覽器,下載地址:谷歌瀏覽器。然后Selenium框架嘛,大家都會下的啦,pip就搞定了,最后就是要下載個Chrome瀏覽器的驅動程序,為了讓Selenium和瀏覽器之間產生關聯的一個東西,下載地址:chromedriver(注意谷歌瀏覽器與驅動chromedriver有版本匹配問題!谷歌瀏覽器會強制更新軟件可以考慮拿一個綠色版到項目里面,然后配置一下瀏覽器的路徑就好)。安裝好瀏覽器后,將瀏覽器驅動放在瀏覽器同級目錄下,這樣前期工作就算都預備好了。
注:不要隨便亂下瀏覽器和驅動,每個瀏覽器和驅動器的版本都必須是一一對應的,不是通用的。
二、與瀏覽器建立連接
做好前面的准備工作,我們只需要寫入幾行Python代碼即可與瀏覽器進行交互,如下:
from selenium import webdriver
c=webdriver.Chrome(executable_path=r'./chromedriver.exe') #獲取chrome瀏覽器的驅動,並啟動Chrome瀏覽器
c.get('https://www.baidu.com')#打開百度
- 1
- 2
- 3
三、查找元素
對於操作瀏覽器中的頁面的自動化測試框架來說,肯定少不了 去發現網頁中的元素,你只有發現那些元素實時存在了才能做出下一步的操作。Selenium中提供了眾多的方法供我們去找到網頁中的元素,這給我們帶來了很大的便利,那么都有哪些方法了,我們可以通過Python快速獲取到這些方法:
可以看到只要是前面帶有Find字樣的方法都是。下面我們來簡要說說這些方法的作用以及如何使用,如下:
find_element #通過指定方法查找指定的一個元素(需指定兩個參數)
find_element_by_class_name #通過Class name查找指定的一個元素
find_element_by_css_selector #通過CSS選擇器查找指定的一個元素
find_element_by_id #通過ID查找指定的一個元素
find_element_by_link_text #通過鏈接文本獲取指定的一個超鏈接(精確匹配)
find_element_by_name #通過Name查找指定的一個元素
find_element_by_partial_link_text #通過鏈接文本獲取指定的一個超鏈接(模糊匹配)
find_element_by_tag_name #通過標簽名查找指定的一個元素
find_element_by_xpath #通過Xpath語法來指定的一個元素
find_elements #通過指定方法查找所有元素(需指定兩個參數)
find_elements_by_class_name #通過Class name查找所有元素
find_elements_by_css_selector #通過CSS選擇器查找所有元素
find_elements_by_id #通過ID查找所有元素
find_elements_by_link_text #通過鏈接文本獲取所有超鏈接(精確匹配)
find_elements_by_name #通過Name查找所有元素
find_elements_by_partial_link_text #通過鏈接文本獲取所有超鏈接(模糊匹配)
find_elements_by_tag_name #通過標簽名查找所有元素
find_elements_by_xpath #通過Xpath語法來查找所有元素
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
下面我們就上面提到的方法做部分解讀,這里我們選擇打開百度首頁並且定位輸入框,如下:
可以看到輸入框的ID為KW,Name為WD,這里我們選擇ID,選擇ID有三種方法,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.get('https://www.baidu.com')
kw1=c.find_element(By.ID,'kw')
kw2=c.find_element_by_id('kw')
kw3=c.find_elements_by_id('kw')[0]
print(kw1)
print(kw2)
print(kw3)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
可以看到我們成功使用三種方法獲取到了這個元素,其它方法差不多,都是一通百通,喜歡哪種方法就使用哪種方法
四、瀏覽器操作
1.獲取本頁面URL
c.current_url
- 1
2.獲取日志
c.log_types #獲取當前日志類型
c.get_log('browser')#瀏覽器操作日志
c.get_log('driver') #設備日志
c.get_log('client') #客戶端日志
c.get_log('server') #服務端日志
##3.窗口操作
c.maximize_window()#最大化
c.fullscreen_window() #全屏
c.minimize_window() #最小化
c.get_window_position() #獲取窗口的坐標
c.get_window_rect()#獲取窗口的大小和坐標
c.get_window_size()#獲取窗口的大小
c.set_window_position(100,200)#設置窗口的坐標
c.set_window_rect(100,200,32,50) #設置窗口的大小和坐標
c.set_window_size(400,600)#設置窗口的大小
c.current_window_handle #返回當前窗口的句柄
c.window_handles #返回當前會話中的所有窗口的句柄
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
4.設置延時
c.set_script_timeout(5) #設置腳本延時五秒后執行
c.set_page_load_timeout(5)#設置頁面讀取時間延時五秒
- 1
- 2
5.關閉
c.close() #關閉當前標簽頁
c.quit() #關閉瀏覽器並關閉驅動
- 1
- 2
6.打印網頁源代碼
c.page_source
- 1
7.屏幕截圖操作
c.save_screenshot('1.png')#截圖,只支持PNG格式
c.get_screenshot_as_png() #獲取當前窗口的截圖作為二進制數據
c.get_screenshot_as_base64() #獲取當前窗口的截圖作為base64編碼的字符串
8.前進后退刷新
c.forward() #前進
c.back() #后退
c.refresh()#刷新
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
9.執行JS代碼
在Selenium中也可以自定義JS代碼並帶到當前頁面中去執行,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.get('https://www.baidu.com')
kw1=c.find_element(By.ID,'kw')
c.execute_script("alert('hello')")
time.sleep(3)
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
這里我使用一個JS中的函數來執行屏幕提示的功能,成功被執行。
10.Cookies操作
c.get_cookie('BAIDUID') #獲取指定鍵的Cookies
c.get_cookies() #獲取所有的Cookies
for y in c.get_cookies():
x=y
if x.get('expiry'):
x.pop('expiry')
c.add_cookie(x) #添加Cookies
c.delete_cookie('BAIDUID') #刪除指定鍵的Cookies內容
c.delete_all_cookies() #刪除所有cookies
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
11.獲取標題內容
c.title
- 1
12.獲取當前瀏覽器名
c.name
- 1
13.全局超時時間
c.implicitly_wait(5)
- 1
五、元素操作
對我們找到的元素進行二次操作,不僅可以再次選擇子元素還可以進行其它操作。如下:
kw1.clear() #清除元素的值
kw1.click() #點擊元素
kw1.id #Selenium所使用的內部ID
kw1.get_property('background') #獲取元素的屬性的值
kw1.get_attribute('id') #獲取元素的屬性的值
kw1.location #不滾動獲取元素的坐標
kw1.location_once_scrolled_into_view #不滾動且底部對齊並獲取元素的坐標
kw1.parent #父元素
kw1.send_keys('') #向元素內輸入值
kw1.size #大小
kw1.submit #提交
kw1.screenshot('2.png') #截取元素形狀並保存為圖片
kw1.tag_name #標簽名
kw1.text #內容,如果是表單元素則無法獲取
kw1.is_selected() #判斷元素是否被選中
kw1.is_enabled() #判斷元素是否可編輯
kw1.is_displayed #判斷元素是否顯示
kw1.value_of_css_property('color') #獲取元素屬性的值
kw1._upload('2.png') #上傳文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
六、鍵盤鼠標操作
1.模擬鍵盤輸入和按鍵
from selenium.webdriver.common.keys import Keys
c.find_element(By.ID,'kw').send_keys('python')#輸出Python
c.find_element(By.ID,'kw').send_keys(Keys.ENTER)#回車鍵
c.find_element(By.ID,'kw').click()#點擊
- 1
- 2
- 3
- 4
這里列舉出了一個最簡單的鍵盤輸入和鼠標點擊的例子,不過我們在Selenium中可以使用更為高逼格的操作,那么是什么了?當然是咱們的鼠標鍵盤監聽事件來觸發事件啦,而且它里面的方法的確也很多樣化,滿足小編日常的騷操作不在話下,如下所示:
click(on_element=None) #鼠標左鍵單擊
click_and_hold(on_element=None) #單擊鼠標左鍵,不松開
context_click(on_element=None) #單擊鼠標右鍵
double_click(on_element=None) #雙擊鼠標左鍵
drag_and_drop(source,target) #拖拽到某個元素然后松開
drag_and_drop_by_offset(source,xoffset,yoffset) #拖拽到某個坐標然后松開
key_down(value,element=None) #按下鍵盤上的某個鍵
key_up(value, element=None) #松開鍵盤上的某個鍵
move_by_offset(xoffset, yoffset) #鼠標從當前位置移動到某個坐標
move_to_element(to_element) #鼠標移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) #移動到距某個元素(左上角坐標)多少距離的位置
pause(seconds) #暫停所有輸入(指定持續時間以秒為單位)
perform() #執行所有操作
reset_actions() #結束已經存在的操作並重置
release(on_element=None) #在某個元素位置松開鼠標左鍵
send_keys(*keys_to_send) #發送某個鍵或者輸入文本到當前焦點的元素
send_keys_to_element(element, *keys_to_send) #發送某個鍵到指定元素
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
以上就是咱們鼠標和鍵盤的全部操作了,小編將用一個例子帶大家零基礎入門。如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.get('https://www.baidu.com')
a=ActionChains(c)
kw1=c.find_element(By.ID,'kw')
tj=c.find_element(By.ID,'su')
tj.send_keys(Keys.CONTROL,'c') #復制
a.drag_and_drop(kw1,tj).perform()#從輸入框拖動到搜索按鈕
kw1.send_keys(Keys.CONTROL,'v')#粘貼
tj.send_keys(Keys.ENTER)
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
這里我們通過對事件的監控,進行復制和粘貼,這里涉及到一個組合鍵的知識,大家注意。
七、選項操作
我們可以通過給當前操作的對象一些選項來增強交互能力,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.chrome.options import Options
o=Options()
o.add_argument('--headless')#無界面瀏覽
c=webdriver.Chrome(executable_path=r'./chromedriver.exe',chrome_options=o)
c.get('https://www.baidu.com')
kw1=c.find_element(By.ID,'kw')
print(c.title)
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
這個時候就實現了咱們的無界面瀏覽了,也就是不用打開瀏覽器即可自動返回執行的結果。不過你可別以為選項就那么一兩個,那可是多到你懷疑人生的,例如:
o.add_argument('--window-size=600,600') #設置窗口大小
o.add_argument('--incognito') #無痕模式
o.add_argument('--disable-infobars') #去掉chrome正受到自動測試軟件的控制的提示
o.add_argument('user-agent="XXXX"') #添加請求頭
o.add_argument("--proxy-server=http://200.130.123.43:3456")#代理服務器訪問
o.add_experimental_option('excludeSwitches', ['enable-automation'])#開發者模式
o.add_experimental_option("prefs",{"profile.managed_default_content_settings.images": 2})#禁止加載圖片
o.add_experimental_option('prefs',
{'profile.default_content_setting_values':{'notifications':2}}) #禁用瀏覽器彈窗
o.add_argument('blink-settings=imagesEnabled=false') #禁止加載圖片
o.add_argument('lang=zh_CN.UTF-8') #設置默認編碼為utf-8
o.add_extension(create_proxyauth_extension(
proxy_host='host',
proxy_port='port',
proxy_username="username",
proxy_password="password"
))# 設置有賬號密碼的代理
o.add_argument('--disable-gpu') # 這個屬性可以規避谷歌的部分bug
o.add_argument('--disable-javascript') # 禁用javascript
o.add_argument('--hide-scrollbars') # 隱藏滾動條
o.binary_location=r"C:\Users\Administrator\AppData\Local\Google\Chrome\Application" #指定瀏覽器位置 (可以考慮復制一個綠色版到項目,再指定)
o.add_argument('--no-sandbox') #解決DevToolsActivePort文件不存在的報錯
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
其實選項的添加無非就是分為以下這幾種,如下:
o.set_headless() #設置啟動無界面化
o.binary_location(value) #設置chrome二進制文件位置
o.add_argument(arg) #添加啟動參數
o.add_extension(path) #添加指定路徑下的擴展應用
o.add_encoded_extension(base64) #添加經過Base64編碼的擴展應用
o.add_experimental_option(name,value) #添加實驗性質的選項
o.debugger_address(value) #設置調試器地址
o.to_capabilities() #獲取當前瀏覽器的所有信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
雖然選項很多,但是我們真正能用到的不多,一般就是無痕模式或者禁用JavaScript和圖片來快速獲取到相關信息。雖然我們上面使用的是Options方法,但是在實際應用中建議大家使用的ChromeOptions方法。
八、框架操作(Frame/IFrame)
我們還可以操作框架里的東西,比如IFrame,Frame等等,雖然都是框架,但是這兩者操作起來還是有很大差別的。下面我們就來看看吧,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('https://hao.360.com/?a1004')
#ss=c.find_element(By.CLASS_NAME,'NEWS_FEED_VIDEO_1595850774217HPA70')#不容易找到標簽
c.switch_to.frame(0)#索引
c.switch_to.frame('NEWS_FEED_VIDEO_1595850774217HPA70-VideoIframe') #ID
c.switch_to.frame('NEWS_FEED_VIDEO_1595850774217HPA70')#Class
c.switch_to.frame(c.find_element_by_tag_name("iframe"))#標簽
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
這里小編是以360瀏覽器的主頁為例子,對它里面的IFrame進行訪問,最有效的方法一般就是我上面提到的四種了。這里我們有時候因為這個框架需要加載才可以出來,所以很多時候是無法獲取到的,因此我們只有使用滑動加載到出現這個標簽或者ID,Class為可以獲取到,這在剛才小編是說了的,大家可以往前看看,不過這個方法不推薦使用,為啥?因為開發者文檔上是這樣寫的。我們的Frame由於是IFrame里的子集,所以上面的方法便是可以層層遍歷的好方法,但是如果我們遍歷到最后了如何返回主框架了,可以這樣做,如下所示:
c.switch_to.default_content()
- 1
這樣就可以回到主框架繼續進行操作了。如果我們由里往外遍歷的話,那么可以這樣來做,如下:
c.switch_to.parent_frame()
- 1
九、Alert
在彈窗處理中,我們會遇到三種情況,如下:
瀏覽器彈出框
新窗口彈出框
人為彈出框
那么我們該怎么分辨了?下面跟我一起看看吧。
1.瀏覽器彈出框
首先說說瀏覽器彈出框,想必大家對JavaScript中的Alert,Confirm,Prompt應該不是很陌生,就是彈出框,確認框,輸入框;基本方法我們來看下,如下:
from selenium.webdriver.common.alert import Alert
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('https://www.baidu.com')
a1=Alert(c)
a1.accept() #確定
a1.dismiss() #取消
a1.authenticate(username,password) #用戶身份驗證
a1.send_keys('') #輸入文本或按鍵
a1.text #獲取彈窗內容
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
這里我們應對每種情況它上面的方法的對應位置都是會有所變化的,所以我們需要根據具體情況來進行操作,而且還可以使用另一種方法,如下:
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('https://www.baidu.com')
a1=c.switch_to_alert()
a1.accept() #確定
a1.dismiss() #取消
a1.authenticate(username,password) #用戶身份驗證
a1.send_keys('') #輸入文本或按鍵
a1.text #獲取彈窗內容
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
注:該類方法必須在有彈框的情況下才有作用,如沒有會報錯。
2.新窗口彈出框
上面就是瀏覽器彈出框的處理方法了,如果是新窗口彈出的話那么就不一樣了,我們需要通過句柄來定位,前面我們提到過這兩個方法。下面我們來看看它們的具體用法,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('https://www.baidu.com')
kw1=c.find_element(By.ID,'kw')
tj=c.find_element(By.ID,'su')
hwnd=c.window_handles #所有窗口句柄
for h in hwnd:
if h !=c.current_window_handle: #如果句柄不是當前窗口句柄則切換 c.switch_to_window(h) #切換窗口
else:
print('無需切換窗口')
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
注:如果有多個窗口,當你關閉了當前窗口想切換到另一個窗口,你需要把沒關閉的窗口切換成當前活動窗口,因為Selenium是不會為你做這件事的。
3.人為彈出框
這類彈出框是我們自己開發的,一般都是使用Div包裹一些其它的元素標簽然后形成一個整體,當我們觸發某個事件的時候就會出現,否則消失。這種彈出框使用我們的眾多Find前綴的方法就能遍歷到,很方便,這里不一一細說。
十、判斷
在Selenium中我們在做自動化測試時常無法判斷一個元素是否真的顯示出來了,因此會各種報錯,接下來我們對這些操作進行判斷,如果顯示出了我們預期的值,那么就進行下一步操作,否則就關閉或者暫停幾秒然后再判斷,這里我要跟大家說Selenium中的一個模塊-----Expected_Conditions,簡稱為EC,如下所示:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('https://baidu.com')
t=EC.title_is('百度一下,你就知道')
print(t(c))
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
這里其實就是判斷當前頁面的標題是否是我們給定的文本,可以看出這里為True,說明是。它不光就一個方法哦,還有其它的,小編在這里大致說下,如下所示:
EC.title_contains('')(c)#判斷頁面標題是否包含給定的字符串
EC.presence_of_element_located('')(c) #判斷某個元素是否加載到dom樹里,該元素不一定可見
EC.url_contains('')(c) #判斷當前url是否包含給定的字符串
EC.url_matches('')(c) #匹配URL
EC.url_to_be('')(c) #精確匹配
EC.url_changes('')(c) #不完全匹配
EC.visibility_of_element_located('')(c) #判斷某個元素是否可見,可見代表元素非隱藏元素
EC.visibility_of('')(c) #跟上面一樣,不過是直接傳定位到的element
EC.presence_of_all_elements_located('')(c) #判斷是否至少有1個元素存在於dom樹中
EC.visibility_of_any_elements_located('')(c) #判斷是否至少一個元素可見,返回列表
EC.visibility_of_all_elements_located('')(c) #判斷是否所有元素可見,返回列表
EC.text_to_be_present_in_element('')(c) #判斷元素中的text是否包含了預期的字符串
EC.text_to_be_present_in_element_value('')(c)#判斷元素中value屬性是否包含預期的字符串
EC.frame_to_be_available_and_switch_to_it('')(c) # 判斷該frame是否可以switch進去
EC.invisibility_of_element_located('')(c) #判斷某個元素是否不存在於dom樹或不可見
EC.element_to_be_clickable('')(c) #判斷某個元素中是否可見並且可點擊
EC.staleness_of('')(c) #等某個元素從dom樹中移除
EC.element_to_be_selected('')(c) #判斷某個元素是否被選中了,一般用在下拉列表
EC.element_located_to_be_selected('')(c) #判斷元組中的元素是否被選中
EC.element_selection_state_to_be('')(c) #判斷某個元素的選中狀態是否符合預期
EC.element_located_selection_state_to_be('')(c) #跟上面一樣,只不過是傳入located
EC.number_of_windows_to_be('')(c) #判斷窗口中的數字是否符合預期
EC.new_window_is_opened('')(c) #判斷新的窗口是否打開
EC.alert_is_present('')(c) #判斷頁面上是否存在alert
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
這就是它全部的方法了,簡直不要多簡單。
十一、選擇
剛剛講過判斷,現在我們來說說選擇,選擇無非就是挑好的扔爛的,順着思路來不會錯,總體來講還是挺簡單的,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
import time
c=webdriver.Chrome(executable_path=r'./chromedriver.exe')
c.implicitly_wait(10)
c.get('http://www.juliwz.cn/forum.php')
s=Select(c.find_element_by_id('ls_fastloginfield'))#實例化
res=s.all_selected_options#全部選中子項
res1=s.options#全部子項
print(res)
print(res1)
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
發覺主流網站都沒有Select這個標簽,於是找了個很冷門的網站,就一個Select。Select里面的方法也是相當多的,如下:
s.first_selected_option #第一個選中的子項
s.select_by_index(index) #根據索引選擇
s.select_by_value(value) #根據值來選擇
s.select_by_visible_text(text) #根據選項可見文本
s.deselect_by_index(index) #根據索引來取消選擇
s.deselect_by_value(value) #根據值來取消選擇
s.deselect_by_visible_text(text) #根據可見文本來取消選擇
s.deselect_all() #取消所有選擇
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
十二、顯示等待和隱式等待
想必大家應該聽過這個概念,顯示等待就是瀏覽器在我們設置的時間內不斷尋找,等到元素后才繼續執行,如果沒在規定時間內找到,也會拋異常;而隱式等待則是我們設置時間,然后程序去找元素,期間會不斷刷新頁面,到了時間仍然沒找到就拋異常。這里有個常用的模塊專門用來實現顯示等待和隱式等待的,它就是”wait“,我們來看看吧。如下:
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
c=webdriver.Chrome(executable_path=r'C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chromedriver.exe')
c.get('https://www.baidu.com/')
su=WebDriverWait(c,10).until(lambda x:x.find_element_by_id('su'))
su.location_once_scrolled_into_view
print(su.get_attribute('value'))
time.sleep(3)
c.close()
c.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
隱式等待很簡單,就一行代碼,如下:
c.implicitly_wait(10)
- 1
它的等待時間適用於全局的環境,也就是任何地方找不到某個元素,它都將發揮作用,如果找得到,則不會產生作用。
十三、總結
Selenium的內容其實還是挺豐富的,它還有手機端的自動化測試框架,不過小編先把WEB端講完就可以了,畢竟也寫了這么多了,日后有時間再慢慢了解。大家如果是對觸摸活動事件感興趣的也可以看看“touch_actions"這個模塊。這個模塊里集成的都是關於觸摸屏的操作,里面也有很多的方法,小編之所以能把Selenium一天學完,還是Selenium模塊中的文檔比較給力,主要是介紹的比較好,讓人能輕松聯想到方法的使用,感激開源作者的無私奉獻。