我可以从Selenium调用AngularJS函数吗?

时间:2015-11-23 03:38:48

标签: java angularjs selenium

我的部分网络应用程序的配置需要上传文件。目前使用AngularJS

实现
<div ng-file-drop="onFileSelected($files)">Upload Files</div>

使用Selenium从文件系统中删除文件似乎几乎不可能,而SendKeys方法在这里不起作用,因为我只有div而不是input

替代方案似乎是直接调用Angular函数。 我该怎么做?

1 个答案:

答案 0 :(得分:2)

我很确定您仍然可以在DOM中找到type="file"的输入。

我们来看一个示例Angular File Upload DEMO page。有一个ng-file-upload div,你可以将文件拖放到,但是,如果要检查DOM,你会看到一个实际负责上传的隐藏文件输入元素

我们在测试中可以做的是使输入可见,以便我们可以与它进行交互并向其发送包含要上传的文件的绝对路径的密钥。使文件输入可见的示例代码:

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");

适用于提供的小提琴的示例代码:

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")

将路径发送到输入后,将触发上传过程。