我的网络应用程序的一部分具有需要上传文件的配置。目前这是使用 AngularJS 实现的
<div ng-file-drop="onFileSelected($files)">Upload Files</div>
使用 Selenium 从文件系统中删除文件似乎几乎是不可能的,并且 SendKeys 方法在这里不起作用,因为我拥有的只是一个 div
而不是 input
。
替代方案似乎是直接调用 Angular 函数。 我该怎么做?
最佳答案
我很确定您仍然可以在 DOM 中找到带有 type="file"
的输入。
让我们看一个例子 Angular File Upload DEMO page 。有一个 ng-file-upload div,您可以将文件拖放到上面,但是,如果您检查 DOM,您将看到一个实际上负责上传的隐藏文件输入元素 .
我们在测试中可以做的是使输入可见,以便我们可以与其交互并向其发送包含要上传的文件的绝对路径的 key 。使文件输入可见的示例代码:
WebElement fileInput = driver.findElement(By.cssSelector("input[ng-model=files]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].style.visibility = 'visible'; arguments[0].style.overflow = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1", fileInput);
fileInput.sendKeys("/absolute/path/to/a/file");
适用于所提供的 fiddle 的示例代码:
driver.switchTo().frame("result");
// waiting for the element to appear
WebDriverWait wait = WebDriverWait(driver, 10);
WebElement fileInput = wait.until(ExpectedConditions.presencefElementLocated(By.cssSelector("input[ng-model=file]")));
// making the element visible
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].style.visibility = 'visible'; arguments[0].style.overflow = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1",
fileInput);
fileInput.sendKeys("/absolute/path/to/the/file")
一旦路径发送到输入,就会触发上传过程。
关于java - 我可以从 Selenium 调用 AngularJS 函数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33863392/