配置好Python環(huán)境和Selenium后,使用PyCharm開始自動(dòng)化測(cè)試吧。
Hello 自動(dòng)化測(cè)試
from selenium import webdriver
import time
dr = webdriver.Firefox() # 初始化火狐瀏覽器實(shí)例
dr.maximize_window() # 最大化瀏覽器
dr.get("http://www.baidu.com/") # 通過get方法打開一個(gè)url網(wǎng)站
print(dr.title) # 打印頁面title
dr.find_element_by_id("kw").send_keys("python") # 獲取id是'kw'的元素,設(shè)置值為'Python'
time.sleep(3) # 強(qiáng)制等待3秒
dr.find_element_by_id("su").click() # 獲取id是'su'的元素,點(diǎn)擊一下
time.sleep(3) # 強(qiáng)制等待3秒
dr.quit() # 關(guān)閉瀏覽器
運(yùn)行!就能看到效果了。
其中time.sleep(3)強(qiáng)制等待3秒才執(zhí)行下面的步驟,有可能3秒過后網(wǎng)頁還沒有加載完,會(huì)發(fā)生不知名的錯(cuò)誤。
那就把3變大一點(diǎn)變成10,time.sleep(10)。如果這樣自動(dòng)化的效率就很低了。??
time.sleep()這是非常重要的一部分
例如在爬取使用ajax、js等方法編寫的網(wǎng)頁就不能確定我們定位的元素是否已經(jīng)加載出來了。當(dāng)元素未加載出來時(shí),我們就去調(diào)用當(dāng)然會(huì)時(shí)常遇到報(bào)錯(cuò)的情況。
在處理這些界面讀取時(shí)常采用以下兩種方法。
方法一 time.sleep() 不推薦,固定等待時(shí)間不能確定是否足夠頁面加載完成
方法二 顯式等待 指滿足某一條件之后再執(zhí)行后面的代碼 可以設(shè)置最長(zhǎng)的等待時(shí)間
顯式等待
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
import time
dr = webdriver.Firefox() # 初始化火狐瀏覽器實(shí)例
dr.maximize_window() # 最大化瀏覽器
dr.get("http://www.baidu.com/") # 通過get方法打開一個(gè)url網(wǎng)站
print(dr.title) # 打印頁面title
try:
# 判斷頁面元素是否已經(jīng)加載出來
element = WebDriverWait(dr, 10).until(EC.presence_of_element_located((By.ID, "kw")))
dr.find_element_by_id("kw").send_keys("python")
dr.find_element_by_id("su").click()
finally:
time.sleep(3) # 等待3秒再關(guān)閉瀏覽器
dr.quit() # 關(guān)閉瀏覽器
關(guān)于CSS定位
- id屬性、class、標(biāo)簽定位他們還能組合在一起使用
以百度首頁為例
#表示id屬性 .表示class屬性 標(biāo)簽直接使用
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("input")
其中dr.find_element_by_css_selector("#kw") 和dr.find_element_by_id("kw")是一樣的
- 組合形式
dr.find_element_by_css_selector("input.s_ipt")
- 層級(jí)關(guān)系
這里是input下的span下的a元素
dr.find_element_by_css_selector("input > span > a")