《手把手教你》系列技巧篇(五十三)-java+ selenium自動化測試-上傳文件-上篇(詳細教程)

1.簡介

  在實際工作中,我們進行web自動化的時候,文件上傳是很常見的操作,例如上傳用戶頭像,上傳身份證資訊等。所以宏哥打算按上傳文件的分類對其進行一下講解和分享。

2.為什麼selenium沒有提供API?

想必小夥伴們或者童鞋們一定很好奇,既然上傳文件在自動化這麼常見而且經常用到,那麼為什麼Selenium的webdriver為什麼不提供方法(API),宏哥這裡解釋一下原因:因為上傳文件需要打開window窗口,webdriver是無法對window的控制項操作的,換句話說就是:selenium無法識別非web的控制項,上傳文件窗口為系統自帶,無法識別窗口元素。所以沒有提供方法,需要我們換個思路去上傳文件。

3.上傳文件分類

首先,我們要區分出上傳按鈕的種類,大體上可以分為兩種,一種是input框,另外一種就比較複雜,通過js、flash等實現,標籤非input。

上傳文件有兩種場景:input控制上傳和非input控制項上傳。大多數情況都是input控制項上傳文件,只有非常少數的使用自定義的非input上傳文件。今天宏哥這一篇文章就用來介紹input控制項上傳文件。

4.input控制項上傳文件

查看上傳文件的頁面元素標籤,如果為input表明是通過input控制項上傳文件。我們可以直接採用直接使用sendKeys()方法上傳文件,這個比較簡單。

示例程式碼:

driver.findElement(By.id("attachment")).sendKeys("D:\\test.txt"); 

5.項目實戰

宏哥找了好久沒有找到,宏哥就參照網上的input上傳修改給一個小demo,進行自動化測試給大家演示一下,主要是知道思路和測試流程就行,其他的也是一樣的,無非是需要你登錄後,然後再上傳文件。

思路

1.定位到選擇文件的輸入框

2.找到這個輸入框元素後使用sendKeys()的方法將你所需上傳文件的絕對路徑名輸入進去,就達到了選擇文件的目的。

5.1demo頁面的HTML程式碼

1.html程式碼:upload_file.html。如下:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>upload_file</title>        
        <script type="text/javascript" async="" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
        <style type="text/css">
            #result{
                width: 1000px;
                height:300px;
                border:1px solid #eee;
            }
            #result img{
                width: 200px;
            }
            input{
                width: 70px;
                margin-top: 10px;
            }
            @-moz-document url-prefix() { input { width:65px; } }/*單獨對火狐進行設置*/
        </style>
        <script type="text/javascript">
    
            var form = new FormData();//通過HTML表單創建FormData對象
            var url = '127.0.0.1:8080/'
            function selectFile(){
                var files = document.getElementById('pic').files;
                console.log(files[0]);
                if(files.length == 0){
                    return;
                }
                var file = files[0];
                //把上傳的圖片顯示出來
                var reader = new FileReader();
                // 將文件以Data URL形式進行讀入頁面
                console.log(reader);
                reader.readAsBinaryString(file);
                reader.onload = function(f){
                    var result = document.getElementById("result");
                    var src = "data:" + file.type + ";base64," + window.btoa(this.result);
                    result.innerHTML = '<img src ="'+src+'"/>';
                }
                console.log('file',file);
                ///////////////////
                form.append('file',file);
                console.log(form.get('file'));
            }
          </script>
    </head> 
    <body>
      <div class="row-fluid">
        <div class="span6 well">        
          <h3>upload_file</h3>
          <div id = "result"></div>
          <input id="pic" type="file" name = 'pic' accept = "image/*" onchange = "selectFile()" />
        </div>        
      </div>        
    </body>
    <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

5.2程式碼設計

5.3參考程式碼

package lessons;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

/**
 * @author 北京-宏哥
 * 
 * @公眾號:北京宏哥
 * 
 * 《手把手教你》系列技巧篇(五十三)-java+ selenium自動化測試-上傳-上篇(詳細教程)
 *
 * 2021年12月10日
 */
public class Upload {

    public static void main(String[] args) throws InterruptedException {
        
        System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe");
        
        WebDriver driver = new ChromeDriver();
        
        driver.manage().window().maximize();  
        
        driver.get("file:///C:/Users/DELL/Desktop/test/upload_file.html");
        Thread.sleep(1000);
            
        driver.findElement(By.cssSelector("input[type=file]")).sendKeys("C:/Users/DELL/Desktop/test/五星紅旗.png");
            
        Thread.sleep(1000);
        System.out.println("browser will be close");
        driver.quit();    
    }

}

5.4運行程式碼

1.運行程式碼,右鍵Run AS->Java Appliance,控制台輸出,如下圖所示:

2.運行程式碼後電腦端的瀏覽器的動作,如下小影片所示:

6.小結

 好了,今天時間也不是很早了,宏哥今天就講解和分享到這裡,感謝您耐心的閱讀,下一篇講解非input控制項是如何上傳文件的。