如何在label标签下找到输入文件类型元素

时间:2017-11-28 14:05:36

标签: java selenium

无法找到以下HTML代码的输入元素。

我的代码:

WebDriverWait wait1 = new WebDriverWait(utils.driver, 30);
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type='file']")));
element = driver.findElement(By.cssSelector("input[type='file']"));
UploadFile().sendKeys("C:\\Users\\....\\Desktop\\TestImage.png");

获取例外:

java.lang.NullPointerException
at pageObjects.ProofPage.UploadFile(ProofPage.java:25)

HTML code excerpt:

<form name="proofCtrl.frmProof" ng-submit="proofCtrl.submitProof( $event )" class="ng-pristine ng-valid">
    <div layout-margin="" class="layout-margin">
        <div class="column">
            <fp-s3-upload user-obj="proofCtrl.userObj" hide-upload-button="true" file-types="jpg,jpeg,png,bmp,gif,pdf,doc,docx,rtf" max-size-in-bytes="12000000" do-upload-all="proofCtrl.doUpload" on-get-url="proofCtrl.getUrl( fileObj )" on-preview-click="proofCtrl.showPreview( imgObj )" on-upload-error="proofCtrl.uploadError( error )" on-upload-warning="proofCtrl.uploadWarning( warning )" on-upload-all-start="proofCtrl.uploadAllStart()" on-upload-all-complete="proofCtrl.uploadAllComplete()" on-add-file="proofCtrl.onAddFile()" on-add-all="proofCtrl.addAll( filesObj, queueCount )" on-remove-file="proofCtrl.removeFile( filesObj, queueCount )" on-add-file-fail="proofCtrl.addFileFail( fileObj, filterObj )" on-item-upload-success="proofCtrl.itemUploadSuccess( fileObj )" class="ng-isolate-scope">
                <div class="fp-s3-upload-container layout-xs-column layout-sm-column layout-gt-sm-row layout-align-xs-stretch-stretch layout-align-sm-stretch-stretch layout-align-gt-sm-stretch-stretch flex-xs-grow flex-sm-grow flex-gt-sm-grow" flex-gt-sm="grow" layout-gt-sm="row" layout-align-gt-sm="stretch stretch" flex-sm="grow" layout-sm="column" layout-align-sm="stretch stretch" flex-xs="grow" layout-xs="column" layout-align-xs="stretch stretch">
                    <div class="fp-s3-upload-target layout-xs-row layout-sm-row layout-gt-sm-column layout-align-xs-stretch-stretch layout-align-sm-stretch-stretch layout-align-gt-sm-stretch-stretch flex-xs-grow flex-sm-grow flex-gt-sm-30" flex-gt-sm="30" layout-gt-sm="column" layout-align-gt-sm="stretch stretch" flex-sm="grow" layout-sm="row" layout-align-sm="stretch stretch" flex-xs="grow" layout-xs="row" layout-align-xs="stretch stretch">
                        <!-- <div ng-show="fpS3UploadCtrl.uploader.queue.length" class="ui red circular label floating ng-hide" ng-cloak>{{ fpS3UploadCtrl.uploader.queue.length }}</div> -->
                        <label ng-attr-for="{{ fpS3UploadCtrl.id }}" nv-file-drop="" nv-file-over="" uploader="fpS3UploadCtrl.uploader" over-class="drag-over" flex="grow" layout="row" layout-fill="" class="layout-fill layout-row flex-grow" for="fpop-14fa8c17018d">
                            <input nv-file-select="" uploader="fpS3UploadCtrl.uploader" ng-attr-id="{{ fpS3UploadCtrl.id }}" multiple="" id="fpop-14fa8c17018d" type="file">
                        </label>
                    </div>
                </div>
            </fp-s3-upload>
        </div>
    </div>
</form>

4 个答案:

答案 0 :(得分:0)

ExpectedConditions.visibilityOfElementLocated会返回一个WebElement,因此您可以直接在其上调用.sendKeys

WebDriverWait wait1 = new WebDriverWait(utils.driver, 30);
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type='file']"))).sendKeys("C:\\Users\\....\\Desktop\\TestImage.png");

答案 1 :(得分:0)

您收到NullPointerException,因为UploadFile()出现了问题。我不确定是什么,因为你没有发布与它相关的代码。从你提供的代码中,我不知道为什么你还需要它。

以下代码应该有效。

WebDriverWait wait1 = new WebDriverWait(utils.driver, 30);
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type='file']"))).sendKeys("C:\\Users\\....\\Desktop\\TestImage.png");

您等待所需元素的可见性,然后.sendKeys()到它。

答案 2 :(得分:0)

尝试使用以下代码:

WebDriverWait wait1 = new WebDriverWait(driver, [TimeOutInSeconds]);
driver.findElement(By.xpath("//input[@type='file']")).sendKeys([FileNameWithPath]);
wait1.until(ExpectedConditions.invisibilityOfElementLocated([ProgressBarLocator]));

其中

  • TimeOutInSeconds -> Maximum Timeout time to upload your file
  • FileNameWithPath = "C:\\Users\\....\\Desktop\\TestImage.png"
  • ProgressBarLocator -> Locator element indicating uploading continues

尝试使用更长的超时时间而不是30秒。它不会影响上传,因为只要上传指标不可见,它就会返回成功。

答案 3 :(得分:0)

根据您分享的代码, NullPointerException 几乎就是因为 -

当你这样做时:

wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type='file']")));

返回WebElement。首先,我们不再需要使用element = driver.findElement(By.cssSelector("input[type='file']"));搜索相同的元素。我们有效地做到了:

WebDriverWait wait1 = new WebDriverWait(utils.driver, 30);
WebElement element = wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type='file']")));

现在,一旦返回预期的 WebElement ,我们只需要在同一 {{1}上调用 sendKeys() 方法 不通过任何其他方法,例如 WebElement ,如下所示:

UploadFile()

为了摆脱 element.sendKeys("C:\\Users\\....\\Desktop\\TestImage.png"); ,您的代码将是:

NullPointerException