selenium -文件上传的实现 -对于含有input element的上传

 

使用selenium做自动化时,我们经常会遇到的一个让人头疼的问题就是文件上传。

问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,难点就解决了。

以下是常见页面形式

分析HTML,发现无论是普通前台还是Extjs,他们的html有一个共同的特点,具有以下代码:

  <input ..... type="file" ...../>

ok,只要我们使用selenium自带的sendkeys把文件路径(相对绝对无所谓)传给该元素,就可绕过选择窗口直接上传文件.

解决方案诞生了

driver.findElement(XXXXX).sendKeys("filePath");

 

一、对于上传文件, 从手动操作我们可以看出, 需要对window 窗体进行操作, 而对于selenium webdriver 在这方面应用就受到了限制。 但是, 庆幸的是, 对于含有input element的上传, 我们可以直接通过sendkeys来传入文件路径,省略了对window 窗体的操作来实现文件上传, 具体实现过程如下:

selenium自带了对应的API可以上传问题,如果这个上传文件的html code中显示的type是file那么你就可以使用下面的代码上传文件。

复制代码
/**
         * click the upload button to upload the file ,this is for hte webFile element ,the input type is file
         * @param driver
         * @param e
         * @param filepath
         * http://sauceio.com/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/
         * upload the local file from remote webdriver
         */
        public void uploadFile(WebElement e,String filepath){
            String uploadcode=getInnerHtmlCode(e);
            highLight(e);
            logger.info("the upload webelement html code we get is:"+uploadcode);
            e.sendKeys(filepath);
        }
复制代码

其中只需要填上对应的上传文件的路径即可,这个针对的是WebDriver实例的,如果是用的是RemoteWebDriver实例,那么你可能还需要设置一个属性如下(它的用途是可以识别运行的server端文件的文件为远程执行机器的路径,所以你可以直接上传文件):

driver.setFileDetector(new LocalFileDetector());
driver=new RemoteWebDriver("",capability);

1)找到上传控件element,并输入路径: 

WebElement element = driver.findElement(By.id("cloudFax-attachment-form-upload-input"));
 element.sendKeys("FilePath");  // FilePath 路径

这样把代码和文件上传到服务器, 就可以找到该文件进行上传。

这里需要注意的几点:

  • The element you want to put filepath is the "whole" input element rather than the "readonly" input element,as below, the first locator is right but the second locator will throw an exception.
  • 直接调用element.sendkeys , 不需要再做一次element.clear(),否则会出现该异常:Element must be user-editable in order to clear it.

   二、对于如下控件的上传方式, 暂时无法实现:

 

 

posted on 2016-05-03 10:09  kitty_zhou  阅读(1429)  评论(0编辑  收藏  举报