1 元素的操作方法
常見元素操作方法:
1、元素.send_keys() ,元素的輸入方法,針對input
2、元素.click(),點擊元素方法,針對link(鏈接)
3、元素.clear(),清空元素的信息,針對input,在輸入之前,需要清空操作,確保輸入的信息是我們所需要的
4、實例
# 1、導(dǎo)包
from time import sleep
from selenium import webdriver
# 2、實例化瀏覽器對象:類名()
driver = webdriver.Chrome()
# 3、打開網(wǎng)頁包含協(xié)議頭
driver.get('https://www.baidu.com/')
# 4、實施操作
# ele1= driver.find_element('id','s_kw_wrap').clear() ## 清空輸入框
ele2 = driver.find_element('id','kw').send_keys('selenium自動化') # 輸入檢索數(shù)據(jù)
ele = driver.find_element('id','su').click() # 點擊操作,查看檢索結(jié)果
sleep(3)
# 5、關(guān)閉網(wǎng)頁
driver.quit()
2 瀏覽器操作模塊
1、導(dǎo)入webdriver模塊:from selenium import webdriver
2、實例化瀏覽器:driver = webdriver.Chrome()
3、常見瀏覽器操作方法
| 瀏覽器操作動作 | 說明 |
|---|---|
| driver.maximize_window() | 最大化瀏覽器 |
| driver.minimize_window() | 最小化瀏覽器 |
| driver.set_window_size(w,h) | 設(shè)置瀏覽器大小 單位像素 |
| driver.set_window_position(x,y) | 設(shè)置瀏覽器位置 |
| driver.current_url | 獲取當(dāng)前頁面url信息 |
| driver.title | 獲取當(dāng)前頁面title信息 |
| driver.get_cookie | 獲取cookie |
| driver.get_cookies | 獲取所有cookie |
| driver.delete_all_cookies() | 刪除所有cookie |
| driver.delete_cookie() | 刪除指定cookie |
| driver.get_window_position | 獲取窗口位置 |
| driver.get_window_rect | 獲取窗口矩形 |
| driver.get_window_size | 獲取窗口大小 |
| driver.back() | 后退操作 |
| driver.forward() | 前進操作 |
| driver.refrensh() | 刷新操作 |
| driver.close() | 關(guān)閉當(dāng)前主窗口(主窗口:默認啟動那個界面,就是主窗口) |
| driver.quit() | 關(guān)閉driver對象啟動的全部頁面 |
4、實例
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.maximize_window() # 窗口最大化
sleep(1)
driver.set_window_size(1000, 1000) # 設(shè)置瀏覽器寬,高
sleep(1)
driver.set_window_position(200, 200)# 設(shè)置窗口瀏覽器位置
sleep(3)
driver.quit()
3 鍵盤操作模塊
1、導(dǎo)入鍵盤模塊的包:from selenium.webdriver.common.keys import Keys
2、send_keys()常用于模擬鍵盤輸入,也可以用于輸入鍵盤上
的按鍵,甚至是組合鍵,如 Ctrl+a、Ctrl+c 等(不區(qū)分大小寫)。
| 表達式 | 說明 |
|---|---|
| send_keys(Keys.BACK_SPACE) | 刪除鍵(BackSpace) |
| send_keys(Keys.SPACE) | 空格鍵(Space) |
| send_keys(Keys.TAB) | 制表鍵(Tab) |
| send_keys(Keys.ESCAPE) | 回退鍵(Esc) |
| send_keys(Keys.ENTER) | 回車鍵(Enter) |
| send_keys(Keys.CONTROL,‘a(chǎn)’) | 全選(Ctrl+a) |
| send_keys(Keys.CONTROL,‘c’) | 復(fù)制(Ctrl+c) |
| send_keys(Keys.CONTROL,‘x’) | 剪切(Ctrl+x) |
| send_keys(Keys.CONTROL,‘v’) | 粘貼(Ctrl+v) |
| send_keys(Keys.F1) | 鍵盤 F1 |
| send_keys(Keys.F12) | 鍵盤 F12 |
實例:
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
# 模擬按下Ctrl+A鍵
ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
driver.find_element_by_xpath(“xpath”).send_keys(Keys.ENTER)# 按下enter
driver.find_element_by_xpath(“xpath”).send_keys(“text”) # 鍵盤輸入
4 鼠標操作模塊
1、導(dǎo)入鼠標操作模塊的包:from selenium.webdriver import ActionChains
2、鼠標操作模塊的語法
# 1、鏈式寫法
ActionChains(driver).動作1.動作2.perform()
# 2、分布執(zhí)行寫法
myaction=ActionChains(driver) # 實例化
myaction.動作1
myaction.動作2
myaction.perfrom()
3、常見的鼠標操作
| 動作 | 說明 |
|---|---|
| click(self,on_element=None) | 左鍵 |
| context_click(self,_on_element=None) | 右鍵 |
| double_click(self,on_element=None) | 雙擊 |
| move_to_element(self,to_element) | 鼠標移動到某個元素(懸停) |
| drag_and_drop(self,source,target) | 拖拽到某個元素然后松開 |
| drag_and_drop_by_offset(self,source,xoffset,yoffset) | 拖拽到某個坐標然后松開 |
| key_down(self,value,element=None) | 按下某個鍵 |
| key_up(self,value,element=None) | 松開某個鍵 |
| move_by_offset(self,xoffset,yoffset) | 鼠標從當(dāng)前位置移動到某個坐標 |
| move_to_element_with_offset(self,to_element,xoffsety,yoffset) | 移動到距某個元素(左上角坐標) 多少距離的位置 |
| release(self,on_element=None) | 在某個元素位置松開鼠標左鍵 |
| send_keys(self,*keys_to_send) | 發(fā)送某個鍵到當(dāng)前焦點的元素 |
| send_keys_to_element(self,element,*keys_to_send) | 發(fā)送某個鍵到指定元素 |
| click_and_hold(self,on_element=None) | 按住左鍵不放 |
注意:selenium 框架雖然提供了 鼠標右鍵方法,但是沒有提供選擇右鍵菜單方法,需要選擇郵件菜單,可以通過鍵盤快捷鍵操作實現(xiàn)
4、實際應(yīng)用
from selenium.webdriver import ActionChains
#鼠標左鍵單擊
driver.find_element_by_xpath(“xpath”).click()
# 鼠標右鍵單擊:
Actions(driver).context_click(driver.find_element_by_xpath(“xpath”)).perform()
# 鼠標懸停:
Actions(driver).move_to_element(driver.find_element_by_xpath(“xpath”)).perform()
# 鼠標拖拽:
Actions(driver).drag_and_drop(source, target).perform()
5 選擇Select操作模塊(下拉框)
1、導(dǎo)入select模塊:from selenium.webdriver.support.select import Select
2、方法說明
select_by_visible_text('男生') # 顯示的文本定位
select_by_value('張三') # value的屬性值定位
select_by_index(0) # 通過索引定位
deselect_all() # 反選所有
3、實例
頁面
<select id="fruit">
<option value="apple">蘋果</option>
<option value="banana">香蕉</option>
<option value="orange">橙子</option>
</select>
定位:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 創(chuàng)建一個Chrome瀏覽器實例
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get("http://example.com")
# 定位下拉框元素
element = driver.find_element_by_id("fruit")
# 將定位到的元素轉(zhuǎn)換成Select類型
select = Select(element)
# 通過value屬性選擇選項
select.select_by_value("banana")
# 關(guān)閉瀏覽器
driver.quit()
6 截圖操作模塊
語法:driver.get_screenshot_as_file(imgepath), imagepath:圖片保存的目錄地址及文件名稱
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
# 截圖方法,建議使用png格式 , ./為當(dāng)前路徑, ../為上一級路徑
driver.get_screenshot_as_file('./info.png')
sleep(3)
driver.quit()
7 三種等待
等待:頁面元素全部加載出來時,元素才能正常定位,如果不等待,那么可能出現(xiàn)定位的元素還沒加載出來,從而定位失敗
三種等待
1、強制等待sleep:在代碼中設(shè)置一個固定的等待時間,無論頁面是否加載完成都會等待一段時間后繼續(xù)執(zhí)行下一步操作。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
time.sleep(10) # 強制等待10秒
element = driver.find_element_by_id("kw")
2、顯式等待WebDriverWait:針對單個元素生效,在規(guī)定的時間內(nèi)找到元素,找到了就執(zhí)行下一步,沒有找重新查找,直到超時則拋出異常(TimeoutException)。
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
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
wait = WebDriverWait(driver, 10) # 設(shè)置顯式等待時間為10秒
element = wait.until(EC.presence_of_element_located((By.ID, "kw")))
3、隱式等待 implicitly_wait:針對全局元素生效,在代碼中設(shè)置一個等待時間,如果在規(guī)定時間內(nèi)頁面加載完成,則繼續(xù)執(zhí)行下一步操作,否則等待時間結(jié)束后拋出異常。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 1、獲取瀏覽器驅(qū)動對象
driver.get('www.baidu.com')
# 2、窗口最大化
driver.maximize_window()
# 3、設(shè)置隱式等待10s
driver.implicitly_wait(10)
ele = driver.find_element_by_id('kw')
ele.send_keys('zhangyisan')
sleep(3) # 強制等待
driver.quit()
8 js操作模塊(系統(tǒng)彈框處理,滾動條拉動)
1、系統(tǒng)彈框處理:使用js實現(xiàn)
2、滾動條處理:使用js實現(xiàn)
滾動條處理步驟:
1、設(shè)置操作滾動條的操作語句:js_down="window.scollTo(0,1000)",0表示左邊距(水平滾動條),1000表示上邊距(垂直滾動條)
2、調(diào)用執(zhí)行js方法,把設(shè)置js語句傳入方法中:driver.execute_script(js_down)
實例
"""
滾動條:selenium中沒有滾動條方法,需要js代碼實現(xiàn)
1、準備js代碼:"window.scrollTo(0, 1000)"
2、執(zhí)行js代碼:driver.execute_script(js的變量)
"""
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.test.coml')
sleep(2)
# 1、準備js代碼
js_down = "window.scrollTo(0, 1000)"
# 2、執(zhí)行js代碼
driver.execute_script(js_down)
sleep(3)
driver.quit()
9 三種切換(自定義彈出框處理)
1、 alert切換: driver.switch_to.alert.方法
自定義彈窗:前端代碼封裝
彈出框的三種形式:alert(警示)、confirm(確認)、prompt(提示)
處理彈出框的步驟:
1、需要切換到對話框:driver.switch_to.alert.方法
2、處理對話框
alert.text # 獲取文本
alert.accept() # 接受alert,只能用這個
alert.dismiss() # 取消,alert,confirm,prompt都可用
實例:
from selenium import webdriverfrom time import sleep
from selenium.webdriver.common.alert import Alert
from selenium.webdriversupport.wait import WebDriverWait
from selenium.webdriversupport import expected conditions as EC
driver = webdriverChromel()
driver.get(r'www.test.com')
test flag = 5
if test flag==5.
# 穩(wěn)定的切換
# 問題: 點擊了alert之后立即去accept等操作,有可能會無法及時彈出alert, 如果定位不到元素,需要等待
driver.find_element(id', confirm).click()
sleep(2) #為了演示
alert = WebDriverWait(driver,5,0.5).until(ECalert_is_present())
alert.accept()
if test flag==4; #另外一種實現(xiàn)
driver.find_element(id , confirm').click)
sleep(2)
Alert(driver).accept0 #不展開
if test flag ==3:
driver.find_element(id, prompt ).click()
sleep(2)
driver.switch_to.alert.send_keys(helloworld) #輸入無顯示
sleep(2)
driver.switch_to.alert.accept() #這里看到helloworld
if test flag ==2:
driverfind element(id', confirm').click()
sleep(2)
driver.switch_to.alert.dismiss() #輸出你選擇了取消
if test flag ==1:
driver.find element(id', alert').click()
sleep(2)
driver.switch_to.alert.accept()
2、frame和iframe 切換:
說明:frame和iframe的定位以及語法格式是一模一樣的,此處只作frame介紹
識別frame-->devtools,console界面的top,frame
定位frame-->xpath定位法(需要切換到frame,一般可以獲取到元素的信息,但是執(zhí)行代碼時無法定位,因此需要先切換到frame)
方法:
driver.switch_to.frame(frame_referrence)
# frame_referrence一般為
# --frame元素的id屬性的值(如果存在)
# --frame元素的name屬性的值(如果存在)
# --frame元素的索引(從0開始)
# --frame元素本身,即find_element得到的對象
driver.switch_to.parent_frame() # 父框架,相當(dāng)于Linux下的 ..
drive.switch_to.default_content() # 默認的路徑(主頁面),相當(dāng)好與Linux下的 ~,回到主頁面的方法
示例:
一般的frame切換:frame切換/窗口切換 | 白月黑羽 (byhy.net)](https://www.byhy.net/tut/auto/selenium/frame/)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 導(dǎo)入驅(qū)動 括號里可填驅(qū)動的具體路徑
driver = webdriver.Chrome()
# 練習(xí)一
# 打開網(wǎng)頁
driver.get("https://cdn2.byhy.net/files/selenium/sample2.html")
# 進入內(nèi)嵌Frame
driver.switch_to.frame('innerFrame')
elements = driver.find_elements(By.CLASS_NAME, 'animal')
# 循環(huán)輸出元素
for element in elements:
print(element.text)
# 再次返回到默認區(qū)域
driver.switch_to.default_content()
driver.find_element(By.ID, 'outerbutton').click()
show = driver.find_element(By.ID, 'add')
show1 = show.find_element(By.TAG_NAME, 'li')
print(show1.text)
# 關(guān)閉頁面
driver.quit()
連續(xù)的frame切換:drive.switch_to.default_content()
"""
需要默認切換到frame
方法:driver.switch_to.default_content()
"""
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.example.com')
driver.switch_to.frame('idframe1')
driver.find_element_by_id('userA').send_keys('admin')
driver.switch_to.default_content()
driver.switch_to.frame('myframe2')
driver.find_element_by_id('userB').send_keys('admin4')
sleep(3)
driver.quit()
3、windows切換:
切換方法:每一個窗口都有唯一的窗口句柄值,可以通過句柄來切換
driver.switch_to.window(window_name) #切換窗口
driver.current_window_handle # 獲取當(dāng)前窗口的句柄
driver.window_handles #獲取當(dāng)前由driver啟動所有窗口句柄
舉例:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driverget(http://12141.14.39:8088/index.html)
first win = driver.current window handle #比如要保留的是第一個窗口,那就記錄下來sleep(2)
driver.execute script(window.open(https://www.baidu.com")#打打開新的窗
cur wins = driver.window handles #當(dāng)前的所有貨
driver.switch to.window(cur winsl-1)#切換到新的窗(假設(shè)就是2個窗口,多個要遍歷,而目新開的就在最后sleep(2)
driver.close0) #切換過去后關(guān)閉掉
driver.switch to.window(first win) #切換到你要保留的那個窗
print(driver.current url)driver.find element( id',username').send keys('123')
10 文件上傳
1、input標簽的文件上傳:使用send_keys
2、非input標簽的文件上傳
- pywinauto 方法
from pywinauto.keyboard import send_keys
time.sleep(3)
send_keys(r'd:\1.png')
send_keys({VK_RETURN}) # 回車操作符號
- pywin32 方法
import pywin32com.client
sh = win32com.client.Dispatch('WScript.shell')
time.sleep(3)
sh.SendKeys(r'd:\1.png'+'\n')
- pyautogui方法
from pywinauto.keyboard import send_keys
time.sleep(3)
send_keys(r'd:\1.png')
send_keys({VK_RETURN}) # 回車操作符號
11 截圖
截圖方法:driver.get_screenshot_as_file(imgepath),imgpath為截圖保存的路徑
舉例:
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('張大仙')
# 截圖方法,建議使用png格式 , ./為當(dāng)前路徑, ../為上一級路徑
driver.get_screenshot_as_file('./info.png')
sleep(3)
driver.quit()