我需要使用Chromedriver通过Selenium WebDriver上传文档。我已经尝试了所有Action类和Javascript内容,但是这些都不起作用。我假设它们不起作用,因为那些依赖按钮作为输入字段,但是,我正在处理的上传按钮却没有。HTML看起来像这样:
<a id="Dialogs_Dialogs_lbAttachUpload" onclick="return ButtonVerifyEnabled(this, ShowFileSelect);" class="SkinButton sbBlue" onmouseover="ButtonHover(this,30);" onmouseout="ButtonLeave(this);" onmousedown="ButtonDown(this,30);" onmouseup="ButtonHover(this,30);" skinheight="30" style="color: white; width: 132px; height: 30px; line-height: 30px; background-position: 0px 0px;" title=""><div class="SkinButtonLeft" style="background-position: 0px 0px;"></div><div class="SkinButtonRight" style="background-position: -4px 0px;"></div>Upload documents</a>
我已经实现并运行了AutoIT和Sikuli,但是这些解决方案的问题在于,通过Jenkins运行Selenium测试时,我无法使它们正常工作。
我最近的尝试是这样的:
WebElement upload = SConfirmOrder.uploadDocuments_btn(driver); Actions actions = new Actions(driver); actions.moveToElement(upload); actions.sendKeys("filepath\\Test PDF.pdf");
它运行成功,但是实际上没有任何文档上载。
浏览器无法上传没有<input>元素的文件,除非文件已从桌面删除。能够通过代码上传文件将构成安全漏洞。
<input>
因此,在您的情况下,<input>可能是在用户单击链接后创建的。
处理这种情况的一种方法是使click事件静音,单击链接,然后将文件设置为<input>:
click
// disable the click event on an `<input>` file ((JavascriptExecutor)driver).executeScript( "HTMLInputElement.prototype.click = function() { " + " if(this.type !== 'file') HTMLElement.prototype.click.call(this); " + "}; " ); // trigger the upload driver.findElement(By.id("Dialogs_Dialogs_lbAttachUpload")) .click(); // assign the file to the `<input>` driver.findElement(By.cssSelector("input[type=file]")) .sendKeys("filepath\\Test PDF.pdf");
请注意,您可能还需要等待的<input>创建。