1. 程式人生 > >Selenium+Python 自動化操控登入介面(有簡單驗證碼圖片校驗)

Selenium+Python 自動化操控登入介面(有簡單驗證碼圖片校驗)

從最簡單的Web瀏覽器的登入介面開始,登入介面如下:
登入介面

進行Web頁面自動化測試,對頁面上的元素進行定位和操作是核心。而操作又是以定位為前提的,因此,對頁面元素的定位是進行自動化測試的基礎。
頁面上的元素就像人一樣,有各種屬性,比如元素名字,元素id,元素屬性(class屬性,name屬性)等等。webdriver就是利用元素的這些屬性來進行定位的。
可以用於定位的常用的元素屬性:
id
name
class name
tag name
link text
partial link text
xpath
css selector
對應於webdriver中的定位方法分別是:
driver.find_element_by_name()——最常用,簡單
driver.find_element_by_id()——最常用,簡單
driver.find_element_by_class_name()
driver.find_element_by_tag_name()——最不靠譜
driver.find_element_by_link_text()——定位文字連線好用
driver.find_element_by_partial_link_text()——定位文字連線好用
driver.find_element_by_xpath()——最靈活,萬能
driver.find_element_by_css_selector()
上面是定位一個元素的方法,相應的webdriver也有定位一組元素的方法:
driver.find_elements_by_name()
driver.find_elements_by_id()
driver.find_elements_by_class_name()
driver.find_elements_by_tag_name()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_xpath()
driver.find_elements_by_css_selector()

由介面可以看出,主要需要三個輸入資料,首先我們要掌握F12檢視頁面元素。
右鍵文字框檢視元素(以使用者名稱文字框為例)
文字框

在該文字框中輸入使用者名稱“XXX”,程式碼如下:

  driver.find_element_by_id("os_username").send_keys("XXX")

密碼同理。
驗證碼操作較為複雜,需要用到PIL+tesseract+image程式碼庫,需提前準備。我的思路是首先採用driver.save_screenshot(“test.png”)擷取該完整登入介面並儲存,而後選取驗證碼區域進行擷取儲存,區域選取採用region = (left.x, left.y, right.x, right.y),其中(left.x,left.y)為左上角畫素座標,(right.x,right.y)為右下角畫素座標,採用nimg = img.crop(region)來擷取驗證碼區域並用nimg.save(“new_test.png”)來儲存。最後採用pytesseract.image_to_string(image)方法將圖片驗證碼轉換成字串。具體程式碼實現詳見附後代碼。
三個輸入完成後,即是登入按鈕的點選,F12檢視元素如圖:
登入


程式碼如下:

    driver.find_element_by_class_name("btnSub").click()

此時即可完成登入,注意,該識別驗證碼的方法只能識別簡單驗證碼,過於複雜的識別會有錯誤。
注:若登陸名為漢字需要使用
G = u”登入名”
driver.find_element_by_id(“os_username”).send_keys(G)

詳細程式碼

    # -*- coding: utf-8 -*-
    #coding=UTF-8

    from selenium import webdriver
    from PIL import
Image import pytesseract driver = webdriver.Chrome() driver.get('http://XXX') #該處為具體網址 driver.refresh() #重新整理頁面 driver.maximize_window() #瀏覽器最大化 driver.save_screenshot("test.png") img = Image.open("test.png") region = (940, 355, 1030, 385)#根據具體情況修改 nimg = img.crop(region) nimg.save("new_test.png") image = Image.open("new_test.png") vcode = pytesseract.image_to_string(image) driver.find_element_by_id("os_username").send_keys("XX X") driver.find_element_by_id("password").send_keys("XXX") driver.find_element_by_id("RandomCode").send_keys(vc ode) driver.find_element_by_class_name("btnSub").click()