selenium 的二三事

 Selenium 做為網頁測試之用真的好用,函式也很直覺,網站上很多相關的文件,這裏紀錄一下自已用到的一些可能比較要注意的。

python

要裝 selenium 

還有一些可能用得到的像是 datetime, time, os, random, pyautogui, yaml, codecs, wget, urllib3

如果要辨識圖形驗證碼,還要再用 cv, tesseract ,這個部份的程式要先裝好,再裝 python 的函式庫

大致的操作 

 引用所需的函式庫往上拉到最上面,以免操作時引用無法順利抓取網頁內容

from datetime import datetime
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
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
import time
import os
import wget
import random
import pyautogui
import cv2
import pytesseract
import yaml
import urllib3
import codecs

設定日期可能少不了

now = datetime.now()
today = now.strftime("%Y%m%d")

讀取帳密也常用

#找到對應的帳密位置
save_path = "D:/somewhere/secrets"
file_name = "pwd.yml"
completeName = os.path.join(save_path, file_name)
conf = yaml.safe_load(open(completeName))
myuid = conf['user']['uid']
mypwd = conf['user']['password']

 接著開始操作瀏覽器

#如果要設定瀏覽器參數
#option = Options()
#option.headless = True
#driver = webdriver.Firefox(options=option)
driver = webdriver.Firefox()
#執行中的視窗移出視線
#driver.set_window_position(-2000, 0)
#視窗啟始位置和大小
driver.set_window_position(0, 0)
driver.set_window_size(960, 1080)
myurl = 'https://anywhere.you.wanna.test/'
driver.get(myurl)
time.sleep(random.uniform(0.1,0.5))
#要等網頁轉址或是讀取完成時,會出現指定的物件,才繼續下一步
wait = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "Wrapper"))
)

driver.execute_script("window.click4ScriptExe('para1','/SomePath/fromPage',para2);")
#this works too
#driver.find_element_by_xpath("//span[contains(.,'按我執行')]").click()

如果要抓圖檔來存

#存一個網頁上的圖檔
with open('image/temp.png', 'wb') as file:
    #identify image to be captured
   img = driver.find_element_by_id('imgId')
#write file 沒有 as_gif 的功能
   file.write(img.screenshot_as_png)

 處理抓到的圖檔

# 二值化影像
command = 'magick convert image/temp.png -threshold ##% -alpha off -transparent white image/captcha.jpg'
os.system(command)
# 轉灰階影像
command = 'magick convert image/captcha.jpg -set colorspace Gray -separate -average image/captcha.jpg'
os.system(command)

辨識圖檔

pytesseract.pytesseract.tesseract_cmd = r"C:\somewhere\tesseract.exe"

image = cv2.imread('image/captcha.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Perfrom OCR with Pytesseract
vdata = pytesseract.image_to_string(gray, lang='chi_tra+eng', config='--psm 6')

 送出表單

driver.find_element_by_id("inputId").send_keys(inputData)
driver.find_element_by_id('someBtnId').click()

 登入後直接跳轉到目標網頁

driver.get("https://some.wanted.url/targetPage")

 下拉式選單

select = Select(driver.find_element_by_id("someFormId"))
select.select_by_visible_text('一般')
#也可以用值選定
#select.select_by_value('N')

 未必什麼按鈕都是 .click() 來處理

#也可以看到底按鈕按下去執行什麼
driver.execute_script("window.EMS_SearchDataGrid('SearchDataGridList');")

 有時侯只存網頁的其中一部份

#要存的網頁內容
html = driver.find_element_by_class_name('someView').get_attribute('outerHTML')
#如果存下來的網頁有亂碼,記得要轉編碼
file_object = codecs.open(htmlFile, "w", "utf-8")
file_object.write(html) 

 記得關測試工具,順序別錯了

driver.close()
driver.quit()

 

差不多就醬,收工!

 

 

 

 

 

 

 

 

 

 


留言

這個網誌中的熱門文章

使用 Excel 計算2個地點之間的直線距離

LINE 儲存的檔案傳到 email 不方便 很不方便 非常不方便 但是有解的筆記

Excel 巨集合併多個 Excel 檔案