Python爬蟲中Selenium實(shí)現(xiàn)文件上傳
前言:大部分的文件上傳功能都是用input標(biāo)簽實(shí)現(xiàn),這樣就完全可以把它看作一個(gè)輸入框,可以通過(guò)send_keys()指定文件進(jìn)行上傳了。
本章中用到的關(guān)鍵方法如下:
send_keys():上傳文件或者輸入文本
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://file.yiyuen.com/file/')
# 定位上傳按鈕,添加本地文件
driver.find_element_by_name("files").send_keys('D:\\test.txt')
time.sleep(10)
driver.quit()
Web上本地上傳圖片,彈出的框Selenium是無(wú)法識(shí)別的,也就是說(shuō),selenium本身沒有直接的方法去實(shí)現(xiàn)上傳本地文件,這里總結(jié)了兩種上傳文件的方式。
一、利用Robot類處理文件上傳。
其大致流程可以為:
1、 利用selenium點(diǎn)擊web上本地文件的上傳按鈕;
2、 在彈出的彈框中,文件路徑輸入框默認(rèn)的是光標(biāo)的聚焦,將文件在磁盤上的路徑通過(guò)拷貝和黏貼的方法寫上去。
3、 通過(guò)按下回車,默認(rèn)觸發(fā)彈框的確定按鈕,完成文件上傳的功能。
這里以百度首頁(yè)的利用圖片搜索為例:
打開百度首頁(yè),搜索按鈕左側(cè)有一個(gè)照相機(jī)的圖標(biāo),點(diǎn)擊可以選擇圖片搜索,我們通過(guò)本地上傳圖片的過(guò)程來(lái)模擬文件自動(dòng)化上傳操作。準(zhǔn)備條件,在百度圖片搜索一個(gè)圖片,保存到桌面,例如找到一個(gè)關(guān)于selenium的圖片,然后保存在桌面,名稱為selenium.jpg。
相關(guān)實(shí)現(xiàn)代碼如下:
package first;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class shangchuang {
public static void main(String[] args)throws Exception {
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
driver.get("https://www.baidu.com");
//指定圖片路徑
StringSelection selection=new StringSelection("C:\\Users\\你的用戶名\\Desktop\\selenium.jpg");
//把圖片路徑復(fù)制到剪切板
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
System.out.println("selection"+selection);
//點(diǎn)擊照相機(jī)這個(gè)工具
driver.findElement(By.xpath("http://*/span[@class='soutu-btn']")).click();
//點(diǎn)擊本地上傳圖片
driver.findElement(By.xpath("http://*/div[@class='upload-wrap']")).click();
//新建一個(gè)Robot類的對(duì)象
Robot robot=new Robot();
Thread.sleep(1000);
//按下Ctrl+V
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
//釋放Ctrl+V
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);
Thread.sleep(2000);
//點(diǎn)擊回車
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
}
二、利用AutoIt上傳文件
以上是第一種方的實(shí)現(xiàn),第二種方式是利用AutoIt這個(gè)工具。這是一個(gè)能支持桌面GUI自動(dòng)化的工具,它支持腳本語(yǔ)言編寫。在Selenium腳本中如果需要AutoIt來(lái)協(xié)助這個(gè)文件上傳功能,大概步驟是這樣的:
1. Selenium點(diǎn)擊web產(chǎn)品上的文件上傳按鈕,彈窗上傳框。
2.執(zhí)行AutoIt實(shí)現(xiàn)準(zhǔn)備好的腳本文件,這個(gè)腳本文件寫了關(guān)于上傳什么文件的一個(gè).exe文件。
在一切測(cè)試工作之前,我們先下載和安裝AutoIt。
1)打開AutoIt的官網(wǎng)下載地址
https://www.autoitscript.com/site/autoit/downloads/
2)點(diǎn)擊下載zip,當(dāng)然也可以下載Editor。

解壓得到的效果如圖:

3)點(diǎn)擊SciTe文件夾,我們打開腳本編輯器。雙擊SciTE.exe

4)打開百度圖片上傳窗口,同時(shí)打開AutoIt 腳本編輯器和元素定位器。拖動(dòng)元素定位器上那個(gè)靶點(diǎn)形狀按鈕到文件上傳彈窗,能夠捕獲到一些元素信息。

5)在AutoIt腳本編輯器里輸入如下腳本,綠色部分為解釋的,不需要寫。

6)編譯成一個(gè).exe文件
先保存到本地,例如默認(rèn)路徑保存,名稱為UploadFile.au3,然后在AutoIt腳本編輯器中點(diǎn)擊Tools菜單,選擇compile,會(huì)在同路徑下生成一個(gè)UploadFile.exe的文件,待會(huì)在Selenium腳本要使用。

7)Selenium腳本執(zhí)行UploadFile.exe文件,觀察文件是否上傳。
package first;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AutoIt {
public static void main(String[] args) throws Exception{
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
driver.get("http://www.baidu.com");
//點(diǎn)擊照相機(jī)這個(gè)工具
driver.findElement(By.xpath("http://*/span[@class='soutu-btn']")).click();
//點(diǎn)擊本地上傳圖片
driver.findElement(By.xpath("http://*/div[@class='upload-wrap']")).click();
// 執(zhí)行桌面的AutoIt封裝的腳本
Runtime.getRuntime().exec("C:\\Users\\你的用戶名\\Desktop\\UploadFile.exe");
}
}
我用的是火狐62,最終的效果如圖所示:

Selenium文集傳送門:
| 標(biāo)題 | 簡(jiǎn)介 |
|---|---|
| Python爬蟲 - Selenium(1)安裝和簡(jiǎn)單使用 | 詳細(xì)介紹Selenium的依賴環(huán)境在Windows和Centos7上的安裝及簡(jiǎn)單使用 |
| Python爬蟲 - Selenium(2)元素定位和WebDriver常用方法 | 詳細(xì)介紹定位元素的8種方式并配合點(diǎn)擊和輸入、提交、獲取斷言信息等方法的使用 |
| Python爬蟲 - Selenium(3)控制瀏覽器的常用方法 | 詳細(xì)介紹自定義瀏覽器窗口大小或全屏、控制瀏覽器后退、前進(jìn)、刷新瀏覽器等方法的使用 |
| Python爬蟲 - Selenium(4)配置啟動(dòng)項(xiàng)參數(shù) | 詳細(xì)介紹Selenium啟動(dòng)項(xiàng)參數(shù)的配置,其中包括無(wú)界面模式、瀏覽器窗口大小設(shè)置、瀏覽器User-Agent (請(qǐng)求頭)等等 |
| Python爬蟲 - Selenium(5)鼠標(biāo)事件 | 詳細(xì)介紹鼠標(biāo)右擊、雙擊、拖動(dòng)、鼠標(biāo)懸停等方法的使用 |
| Python爬蟲 - Selenium(6)鍵盤事件 | 詳細(xì)介紹鍵盤的操作,幾乎包含所有常用按鍵以及組合鍵 |
| Python爬蟲 - Selenium(7)多窗口切換 | 詳細(xì)介紹Selenium是如何實(shí)現(xiàn)在不同的窗口之間自由切換 |
| Python爬蟲 - Selenium(8)frame/iframe表單嵌套頁(yè)面 | 詳細(xì)介紹如何從當(dāng)前定位的主體切換為frame/iframe表單的內(nèi)嵌頁(yè)面中 |
| Python爬蟲 - Selenium(9)警告框(彈窗)處理 | 詳細(xì)介紹如何定位并處理多類警告彈窗 |
| Python爬蟲 - Selenium(10)下拉框處理 | 詳細(xì)介紹如何靈活的定位并處理下拉框 |
| Python爬蟲 - Selenium(11)文件上傳 | 詳細(xì)介紹如何優(yōu)雅的通過(guò)send_keys()指定文件進(jìn)行上傳 |
| Python爬蟲 - Selenium(12)獲取登錄Cookies,并添加Cookies自動(dòng)登錄 | 詳細(xì)介紹如何獲取Cookies和使用Cookies進(jìn)行自動(dòng)登錄 |
| Python爬蟲 - Selenium(13)設(shè)置元素等待 | 詳細(xì)介紹如何優(yōu)雅的設(shè)置元素等待時(shí)間,防止程序運(yùn)行過(guò)快而導(dǎo)致元素定位失敗 |
| Python爬蟲 - Selenium(14)窗口截圖 | 詳細(xì)介紹如何使用窗口截圖 |
| Python爬蟲 - Selenium(15)關(guān)閉瀏覽器 | 詳細(xì)介紹兩種關(guān)閉窗口的區(qū)別 |
到此這篇關(guān)于Python爬蟲中Selenium實(shí)現(xiàn)文件上傳的文章就介紹到這了,更多相關(guān)Selenium 文件上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python SELENIUM上傳文件或圖片實(shí)現(xiàn)過(guò)程
- Selenium瀏覽器自動(dòng)化如何上傳文件
- selenium+python實(shí)現(xiàn)文件上傳操作的方法實(shí)例
- Python selenium文件上傳下載功能代碼實(shí)例
- 基于python的selenium兩種文件上傳操作實(shí)現(xiàn)詳解
- python+selenium+autoit實(shí)現(xiàn)文件上傳功能
- Python中selenium實(shí)現(xiàn)文件上傳所有方法整理總結(jié)
- Python selenium文件上傳方法匯總
- Python中Selenium上傳文件的幾種方式
相關(guān)文章
Python2.X/Python3.X中urllib庫(kù)區(qū)別講解
本篇文章通過(guò)對(duì)比給大家詳細(xì)講解了在Python2和Python3中urllib庫(kù)區(qū)別以及用法講解,有需要的朋友跟著學(xué)習(xí)下吧。2017-12-12
python實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Python操作SQLite數(shù)據(jù)庫(kù)的方法詳解【導(dǎo)入,創(chuàng)建,游標(biāo),增刪改查等】
這篇文章主要介紹了Python操作SQLite數(shù)據(jù)庫(kù)的方法,簡(jiǎn)單說(shuō)明了sqlite數(shù)據(jù)庫(kù)的相關(guān)概念,并結(jié)合實(shí)例形式較為詳細(xì)的分析了Python針對(duì)sqlite數(shù)據(jù)庫(kù)的導(dǎo)入,創(chuàng)建,游標(biāo),增刪改查等操作技巧,需要的朋友可以參考下2017-07-07
Python-OpenCV實(shí)戰(zhàn):利用 KNN 算法識(shí)別手寫數(shù)字
K-最近鄰(KNN)是監(jiān)督學(xué)習(xí)中最簡(jiǎn)單的算法之一,KNN可用于分類和回歸問(wèn)題。本文將為大家介紹的是通過(guò)KNN算法實(shí)現(xiàn)識(shí)別手寫數(shù)字。文中的示例代碼介紹詳細(xì),需要的朋友可以參考一下2021-12-12
Python如何使用內(nèi)置庫(kù)matplotlib繪制折線圖
這篇文章主要介紹了Python如何使用內(nèi)置庫(kù)matplotlib繪制折線圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

