1. 程式人生 > >selenium+python自動化77-autoit文件上傳【轉載】

selenium+python自動化77-autoit文件上傳【轉載】

關於 可用 功能 延遲 get tro sel cmd href

前言

關於非input文件上傳,點上傳按鈕後,這個彈出的windows的控件了,已經跳出三界之外了,不屬於selenium的管轄範圍(selenium不是萬能的,只能操作web上元素)。autoit工具處理windows的控件窗口是專業的,所以這個需借助AutoIt來解決了。

一、環境準備

1.可以autoit官網上下載,安裝 http://www.autoitscript.com/site/
技術分享

2.下載到本地後傻瓜式安裝,安裝完之後在應用程序找到這個Autoit v3
技術分享

3.AutoIt裏面幾個菜單功能介紹:

  • SciTE Script Editor 編輯器,在這裏編寫AutoIt腳本
  • AutoIt Windows Info 元素定位器,用於識Windows控件信息
  • Run Script 執行AutoIt腳本
  • Compile Script to.exe 將AutoIt生成 .exe 可執行文件

4.autoit 在線文檔,是中文版http://www.autoitx.com/Doc/

二、腳本實現

1.先準備好web頁面的環境,以博客園的上傳圖片為例:新建博客>點圖片上傳>上傳本地圖片>彈出選擇圖片界面,在這裏不要動了
技術分享

2.打開 SciTE Script Editor編輯器,開始寫腳本,代碼非常簡單只有四行

WinActivate("文件上傳");
ControlSetText("文件上傳", "", "Edit1", "D:\1.png" );
Sleep(2000);
ControlClick("文件上傳", "", "Button1");

技術分享

3.編輯完成後執行,tools>go ;或者按f5執行,執行完之後就能看到圖片上傳成功了。

4.autoit幾個常用的語法

  • WinActivate("title") 聚焦到指定活動窗口
  • ControlFocus ( "title", "窗口文本", controlID) 設置輸入焦點到指定窗口的某個控件上;
  • WinWait ( "title" , "窗口文本" , 超時時間 ) 暫停腳本的執行直至指定窗口存在(出現)為止;
  • ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本;
  • Sleep ( 延遲 ) 使腳本暫停指定時間,單位是毫秒;
  • ControlClick ( "title", "窗口文本", 控件ID , 按鈕 , 點擊次數 ) 向指定控件發送鼠標點擊命令;

四、元素定位

1.Find Tool 查看元素屬性,用鼠標按住Find Tool下的圖標,然後拖拽到你想定位的元素上
技術分享

2.查看title,title即AutoIt Window Info識別出的Title字段
技術分享

3.查看controlID,controlID即AutoIt Window Info識別出的Class和Instance的拼接

如這裏的“打開”按鈕的Class屬性是Button,Instance屬性是1,那麽controlID屬性就是Button1

技術分享

五、導出為exe文件

1.第三步執行成功後,先把腳本保存到本地
技術分享

2.在應用程序裏面找到打開Compile Script to.exe工具,將剛才導出的.au3文件轉化成.exe文件
技術分享

3.為了驗證這個生成的.exe文件是有效的,先在cmd去執行一次

直接把生成的這個.exe文件拽到cmd裏面,回車就能執行了
技術分享

六、python執行

1.把上傳文件的動作已經弄成了一個.exe的文件了,接下來用python去執行這個.exe文件就能實現文件上傳了

python調用dos,用這個方法os.system("需執行的指令")

# coding:utf-8
from selenium import webdriver
import time
import os
# 加載配置文件實現免登錄
profileDir = r‘C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default‘  # 你自己電腦的配置文件路徑,不要抄我的
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
driver.find_element_by_link_text("新隨筆").click()
time.sleep(3)
# 點開編輯器圖片
driver.find_element_by_css_selector("img.mceIcon").click()
time.sleep(3)
# 定位所有iframe,取第二個
iframe = driver.find_elements_by_tag_name(‘iframe‘)[1]
# 切換到iframe上
driver.switch_to_frame(iframe)
# 點開文件上傳按鈕
driver.find_element_by_name(‘file‘).click()
# 執行autoit上傳文件
os.system("C:\Users\Gloria\Desktop\sendjpg.exe")  # 你自己本地的這個.exe文件絕對路徑

七、autoit命令行參數

1.上面打包的exe文件把上傳文件的路徑給寫死了,每次只能傳固定的那個圖片,我們實際測試時候希望傳不同的圖片,這樣就需要參數化文件路徑了。
想要參數化傳入的參數,可以通過autoit的命令行參數:

    myProg.exe param1 “This is a string parameter” 99

在腳本中,可用以下變量獲取命令行參數:

$CmdLine[0] ; = 3
$CmdLine[1] ; = param1
$CmdLine[2] ; = "This is a string parameter"
$CmdLine[3] ; = 99
$CmdLineRaw ; = ‘param1 "This is a string parameter" 99‘

$CmdLine[0] 獲取的是命令行參數的總數,在上例中$CmdLine[0]=3
$CmdLine[1]~$CmdLine[63] 獲取的是命令行參數第1到第63位,這個方式最多只能獲取63個參數,不過正常情況下是足夠用的
$CmdLineRaw 獲取的是未拆分的所有參數,是一個長字符串,這種情況下不局限與63個參數

WinActivate("文件上傳");
ControlSetText("文件上傳", "", "Edit1", $CmdLine[1] );
Sleep(2000);
ControlClick("文件上傳", "", "Button1");

2.問題來了,如果想批量上傳圖片,又如何實現呢??參數化後是不是so easy了。

selenium+python自動化77-autoit文件上傳【轉載】