1 、打開瀏覽器
方法一:默認安裝到C盤,Chrome
from selenium import webdriver
# 打開瀏覽器
driver = webdriver.Chrome()
#放大瀏覽器
driver.maximize_window()
# 打開百度瀏覽器
driver.get("http://www.jianshu.com")
driver.implicitly_wait(10)
方法二:Chrome瀏覽器沒有安裝到C盤
from selenium import webdriver
options = webdriver.ChromeOptions()
options.binary_location = r"E:\soft\GoogleChrome_72\ChromePortable\App\Google Chrome\chrome.exe"
driver = webdriver.Chrome(executable_path=r"E:\soft\python3.6\chromedriver.exe",chrome_options=options)
driver.get("https://www.baidu.com")
#瀏覽器窗口最大化
driver.maximize_window()
#隱式等待10s
driver.implicitly_wait(10)
2、獲取元素信息
1. text 屬性,顯示該元素在web頁面顯示出來的文本內容
2. get_attribute方法
獲取某個屬性的值:
element.get_attribute(元素屬性)
element.get_attribute('href')
element.get_attribute('style')
獲取該元素對應HTML源代碼:
element.get_attribute('outerHTML')
獲取該元素的內部部分的HTML源代碼:
element.get_attribute('innerHTML')
3、BeautifulSoup4庫
這種方式使用的頻率很少,大家可以百度查找詳細的介紹信息
4、隱士等待時間
driver.implicitly_wait(10)
5、顯示等待
from selenium.webdriver.support.ui import WebDriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
ele = WebDriverWait(driver,60)
until(EC.presence_of_element_located((By.ID,'username')))
#等待60s,知道一個元素出現,id為username的元素
舉個實例:
#為id為1的元素先設置隱士等待=60秒,無論找到未找到,隱士等待時間都會重置為10秒
driver.implicitly_wait(60) try: ele = driver.find_element_by_id('1') print (ele.text) if ele.text.startswith('松勤網 - 松勤軟件測試') print('pass') else: print('fail') except: print('exception happend') finally: driver.implicitly_wait(10)
6、frame處理 : 網頁中內嵌的網頁,frame/iframe
切換frame
driver.switch_to.frame(frame_reference)
1. frame元素的name屬性或者ID屬性
2. 索引值(從0開始)
3. frame所對應的WebElement : driver.find_element_by_tag_name("iframe")
切換回主html里面: driver.switch_to.default_content()
切換到上一層frame框:driver.switch_to.parent_frame()
from selenium import webdriver
from test import mysql_test as myS
import time
driver = webdriver.Chrome(executable_path=r"E:\soft\python3.6\chromedriver.exe")
driver.get("https://mail.qq.com/cgi-bin/loginpage")
#瀏覽器窗口最大化
driver.maximize_window()
#隱式等待10s
driver.implicitly_wait(10)
#切換iframe,切換后點擊切換后的iframe對應的元素
driver.switch_to.frame(driver.find_element_by_id("login_frame"))
driver.find_element_by_id("u").send_keys("123456")
#切換原html
driver.switch_to.default_content()
#點擊微信登錄
driver.find_element_by_id("wxLoginTab").click()
#切換到iframe框架
wei = driver.find_element_by_id("login_wx_iframe")
driver.switch_to.frame(wei)
#獲取標題
print (driver.title)
#獲取當前的URL
print(driver.current_url)
#截圖
driver.get_screenshot_as_file('d://ssl.png')
#獲取窗口的大小,返回字典{'width': 1936, 'height': 1056}
size = driver.get_window_size()
print (size)
driver.set_window_size(size['width'],400)
7、切換窗口,句柄handle
切換到新的窗口里面操作
1.循環遍歷 driver.window_handles
2.driver.switch_to.window(handle)方法切入新窗口
3.檢查該窗口特點,是否為要切入的那個
切換最初的窗口
保存主窗口的handle
關閉窗口
close方法
#獲取瀏覽器所有的handle
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys("松勤自動化\n")
driver.find_element_by_css_selector("[id='1']>h3>a").click()
print(driver.window_handles)
#循環遍歷所有的handle,如果瀏覽器的title等於某一個title,或者某一個title里面存在某一個元素
for handle in driver.window_handles:
#切換新窗口
driver.switch_to.window(handle)
if driver.title == '預期窗口':
break
#循環遍歷所有的handle,跳轉到窗口,如果元素找到則跳轉
for handle in driver.window_handles:
#切換新窗口
driver.switch_to.window(handle)
#判斷當前窗口的特征是否為目標窗口
eles=driver.find_elements_by_css_selector("span>[href='/course/explore']")
if eles:
eles[0].click()
break
7、清除元素中的字符串
clear方法 : input1.clear()
8、獲取文本框中輸入的內容
get_attribute() : 獲取input元素里面輸入的文本內容
input1.get_attribute('value')
9、單選框:type類型是radio
type = "radio"
click()方法選擇 : 不管原來該元素是否選中,直接去點擊該元素沒有問題都可以確保該單選框選中
driver.find_element_by_css_selector("[value='male']").click()
driver.find_element_by_css_selector("[value='female']").click()
#是否被選中
male = driver.find_element_by_css_selector("[value='male']")
if male.is_selected:
print ("單選框被選中")
else:
print ("未被選中")
10、勾選框:type類型CheckBox
type = "checkbox"
click()方法選擇
is_selected()方法來獲取選擇的狀態:
True :已經選中
False:未選中
ele1=driver.find_element_by_css_selector("[value='bike]'")
#如果選中pass,未選中則讓其點擊選中
if ele1.is_selected():
pass
else:
ele1.click()
#選中所有的勾選框
eles=driver.find_elements_by_tag_name('input')
for ele in eles:
#沒有被選中,則讓選中
if not ele1.is_selected():
ele1.click()
11、復選框
select,有multiple可以多選,不寫則單選
可以用selenium的Select類
導入類: from selenium.webdriver.support.ui import Select
方法deselect_all() : 清掉所有選中的元素
方法select_by_visible_text("值"):根據復選框中文本信息選中
可以選擇多個的復選框:
實例如下:
#導入Select類
from selenium.webdriver.support.ui import Select
#獲得相應的WebElement
select = Select(driver.find_element_by_id("multi"))
#去除選擇所有的選項
select.deselect_all()
select.select_by_visible_text("雅閣")
select.select_by_visible_text("寶馬 740")
#獲得相應的WebElement
select = Select(driver.find_element_by_id("single"))
select.select_by_visible_text("男")
#其他幾種選中復選框中內容的方法# 獲得相應的WebElement
select = Select(driver.find_element_by_id("select"))
# 先取消選擇所有的選項
select.deselect_all()
# 通過文本選中 瑪莎拉蒂
select.select_by_visible_text("瑪莎拉蒂")
# 通過 value 值選中 蘭博基尼
select.select_by_value("Lamborghini")
# 通過 index 選擇元素,索引從0開始
select.select_by_index(2)
只能選擇單個復選框
se2=Select(driver.find_element_by_id('single'))
se2.select_by_value('male')
12、獲取標題
driver.title
13、獲取當前url
driver.current_url
14、簡單的斷言
assert driver.title == "百度一下,你就知道"
# 當前瀏覽器的標題是否是“百度一下,你就知道”
15、截屏:
截取整個頁面的方法
driver.get_screenshot_as_file(r'd:\baidu.png')
# 括號里面填寫文件名稱,也可以固定保存路徑
獲取某一個區域的圖片
ele=driver.find_element_by_cas_selector('img[class="d-flag"]')
ele.screenshot(r'D:\music.png')
16、上傳文件,調用系統的Windows框去上傳
需要依賴的第三方庫: pip install pypiwin32
import time
import win32com.client
from selenium import webdriver
# 打開瀏覽器
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://tinypng.com/")
driver.find_element_by_css_selector(".icon").click()
# 因為頁面控件和Windows自帶的框不一致,因此需要等待讓系統的彈窗出來
time.sleep(3)
#開始上傳文件,調用Windows窗口
shell = win32com.client.Dispatch("WScript.Shell")
# 輸入需要上傳文件的路勁,回車換行
shell.SendKeys(r"E:\test.txt"+"\r\n")
time.sleep(3)
driver.quit()
17、瀏覽器的操作,刷新頁面、前進、后退
- 刷新頁面 refresh
- 前進:forward
- 后退:back
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
print(driver.title)
driver.find_element_by_id("kw").send_keys("自動化測試\r\n")
#后退
driver.back()
time.sleep(3)
print(driver.title)
#刷新頁面
driver.refresh()
time.sleep(3)
#前進
driver.forward()
time.sleep(3)
print(driver.title)
driver.quit()
18、滑動屏幕,改變窗口默認大小
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://music.163.com/")
#設置瀏覽器的窗口大小
driver.set_window_size(480,500)
time.sleep(2)
#操作搜索框
driver.find_element_by_id("srch").send_keys("周傑倫\n")
input()
driver.quit()
報錯:message:element not interactable 表示這個元素在頁面上不可見,需要拖動下拉框才能看到這個元素,
這個時候需要讓元素在頁面上可見,才可操作
- 需要將頁面最大化去操作: driver.maxmize_window()
滾動條:
1.使用js,有時候頁面禁止了js腳本,則需要用其他方法2
可以現在瀏覽器中驗證一下,如果不確定是否可以滑到最下面,
可以加個循環多滑動幾次。
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#操作搜索框
driver.find_element_by_id("kw").send_keys("松勤\n")
#滾動頁面,js方法
driver.execute_script("scrollBy(0,2000)")
#點擊下一頁
driver.find_element_by_css_selector("#page>a:nth-child(10)").click()
driver.quit()
滾動條:直接滑到頁面底部和頂部
#滾動條操作 # 直接滑動到底部 js="var q=document.documentElement.scrollTop=10000" # 直接滑動到頂部 js="var q=document.documentElement.scrollTop=0" driver.execute_script(js)
2. 模擬鍵盤
需要導入庫:
import win32api
import win32con
import time
import win32api
import win32con
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://music.163.com/")
driver.implicitly_wait(10)
driver.switch_to.frame("g_iframe")
time.sleep(1)
#需要點擊一下空白頁面,交互一下
driver.find_element_by_css_selector(".v-hd3 .f-fl").click()
time.sleep(1)
for i in range(5): #循環5次,按鍵盤向下鍵
win32api.keybd_event(win32con.VK_DOWN,0)
time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤向上鍵
win32api.keybd_event(win32con.VK_UP,0)
time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤空格鍵
win32api.keybd_event(win32con.VK_SPACE,0)
time.sleep(0.5)
for i in range(5): # 循環5次,按鍵盤向右鍵
win32api.keybd_event(win32con.VK_RIGHT, 0)
time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤向左鍵
win32api.keybd_event(win32con.VK_LEFT,0)
time.sleep(0.5)
driver.quit()
3.獲取窗口大小
size=driver.get_window_size() #返回的是一個字典,可以通過鍵值對的思路去獲取數據
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#設置窗口大小
driver.set_window_size(1400,500)
time.sleep(1)
#獲取窗口大小信息,返回的是一個字典
size=driver.get_window_size()
print(size)
print("width:{},height:{}".format(size['width'],size['height']))
driver.quit()
19、頁面的二次渲染后,再次定位元素
一般情況下報錯:stale element reference表示頁面進行了二次渲染
解決方法,可以將觸發的這個按鈕再次定位,去觸發,比如下面的刪除按鈕,
放到循環里面,讓其每次觸發。
20、模擬鼠標懸停,拖動
需要導入ActionChains類:
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains()
# click需要傳入需要操作的元素,返回的都是自己本身,因此可以連續調用,
# 需要執行的話必須有perform()方法
ac.click(input1).send_keys("input1").click(input2).send_keys("input2").
click(input3).send_keys("input3").perform()
# 定位到需要懸停的元素 move = driver.find_element_by_id("XXXXX") # 對定位到的元素執行懸停操作 ActionChains(driver).move_to_element(move).perform()
#拖動
#兩個參數,拖動的起點和終點,鼠標按下的位置和鼠標松開的位置
ac.drag_and_drop(soure,target)
21、凍結頁面
某些元素在頁面無法定位,則需要凍結頁面,相當於加了一個debug,幾秒后凍結窗口
#多少秒之后對頁面進行凍結
setTimeout(function(){debugger},3000)
23、讓系統發出聲音,提示用戶做一些操作
import winsound
winsound.Beep(2200,3000) #(聲音頻率,聲音時間)
例如:輸入驗證碼,讓系統發出一段聲音,提示人去完成驗證碼的工作
import winsound
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#系統自動提示聲音,(分貝,延長時間)
winsound.Beep(1000,8000)
driver.quit()
彈出對話框:
對話框一般來說有三種:
alert,confirm,prompt
操作方法:
driver.switch_to.alert.accept() #點擊OK
driver.switch_to.alert.text # 得到對話框內容
driver.switch_to.alert.dismiss() # 點擊cancel
driver.switch_to.alert.send_keys() # 輸入內容
1、alert對話框
# 針對這種對話框,python提供了一種方式,alert
#觸發alert
driver.find_element_by_id('b1').click()
#切換到alert框上面
al = driver.switch_to.alert
#獲取alert框上面的信息
print(al.text)
#使用accept方法點擊“確定”
al.accept()
2、confirm對話框
# 針對這種對話框,python提供了一種方式,alert
#觸發alert
driver.find_element_by_id('b2').click()
#切換到alert框上面
al = driver.switch_to.alert
#獲取alert框上面的信息
print(al.text)
#使用accept方法點擊“確定”
al.accept()
#使用dismiss方法點擊“取消”
al.dismiss()
3. prompt對話框
driver.find_element_by_id('b3').click() driver.switch_to.alert.send_keys("hello promot") driver.switch_to.alert.accept()
driver.switch_to.alert.dismiss()
后面有新增的內容,可以繼續補充。。。。。。
歡迎大家可以提更多的建議。。。。。。