#1 楼
是的,可以通过脚本注入使用Selenium删除文件。该脚本需要创建一个<input>
Web元素以接收SendKeys
发送的文件。然后使用在dragenter
对象中设置的文件在目标元素上模拟dragover
,drop
和dataTransfer
事件。本示例将文件系统中的图像拖放到放置区域:
ChromeDriver driver = new ChromeDriver();
driver.get("http://html5demos.com/file-api");
// locate the drop area
WebElement droparea = driver.findElement(By.cssSelector("#holder"));
// drop the file
DropFile(new File("C:\Downloads\image.png"), droparea, 0, 0);
DropFile
方法:public static void DropFile(File filePath, WebElement target, int offsetX, int offsetY) {
if(!filePath.exists())
throw new WebDriverException("File not found: " + filePath.toString());
WebDriver driver = ((RemoteWebElement)target).getWrappedDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
WebDriverWait wait = new WebDriverWait(driver, 30);
String JS_DROP_FILE =
"var target = arguments[0]," +
" offsetX = arguments[1]," +
" offsetY = arguments[2]," +
" document = target.ownerDocument || document," +
" window = document.defaultView || window;" +
"" +
"var input = document.createElement('INPUT');" +
"input.type = 'file';" +
"input.style.display = 'none';" +
"input.onchange = function () {" +
" var rect = target.getBoundingClientRect()," +
" x = rect.left + (offsetX || (rect.width >> 1))," +
" y = rect.top + (offsetY || (rect.height >> 1))," +
" dataTransfer = { files: this.files };" +
"" +
" ['dragenter', 'dragover', 'drop'].forEach(function (name) {" +
" var evt = document.createEvent('MouseEvent');" +
" evt.initMouseEvent(name, !0, !0, window, 0, 0, 0, x, y, !1, !1, !1, !1, 0, null);" +
" evt.dataTransfer = dataTransfer;" +
" target.dispatchEvent(evt);" +
" });" +
"" +
" setTimeout(function () { document.body.removeChild(input); }, 25);" +
"};" +
"document.body.appendChild(input);" +
"return input;";
WebElement input = (WebElement)jse.executeScript(JS_DROP_FILE, target, offsetX, offsetY);
input.sendKeys(filePath.getAbsoluteFile().toString());
wait.until(ExpectedConditions.stalenessOf(input));
}
评论
这看起来很有希望,但是RemoteWebDriver无法解析为一种类型。至少在Selenium-java 3.141.59中没有,我在pom中添加了selenium-remote-driver(版本3.141.59),然后Eclipse可以找到它,但是该RemoteWebDriver版本没有getWrappedDriver()。 :-( 我还可以做些什么?
–蒂哈默(Tihamer)
19年8月21日在17:00
@Tihamer,到目前为止,RemoteWebDriver类型仍然存在:seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/…
–佛罗伦萨B.
19年8月21日在18:30
感谢您的快速回复!是的,RemoteWebDriver确实存在。但是,我只是在您给我的网页上进行了cntl-F搜索:seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/…,但无法找到“ getWrappedDriver” 。它也不在版本3.141.59的源代码中,我正在Eclipse中查看。但是,我做了一个谷歌搜索,并在以下位置找到了该功能:seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium / ...我试图弄清楚如何使用它...
–蒂哈默(Tihamer)
19年8月21日在20:30
我让它工作了,而且效果很好!这是我在设置驱动程序的行中所做的更改:WebDriver driver =((org.openqa.selenium.remote.RemoteWebElement)target).getWrappedDriver();
–蒂哈默(Tihamer)
19年8月22日在2:25
#2 楼
您可以使用AutoIT,它是一种免费的,类似于BASIC的脚本语言,旨在自动执行Windows GUI和常规脚本。它结合了模拟的击键,鼠标移动和窗口/控件操作来自动执行任务。您可以上传多个文件。
请参考此内容
希望对您有所帮助
谢谢
#3 楼
不,你做不到。 Selenium仅与HTML元素交互。您可以使用以下代码处理上传文件的情况
driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("C:\myfile.txt")
p / s:我复制此代码来自下面的参考链接
参考:在Webdriver测试期间如何处理文件上传?
评论
我已经尝试了上面的代码。它给了我以下异常。 org.openqa.selenium.WebDriverException:未知错误:无法聚焦元素
– iAutomate
16年8月25日在4:05
上面的代码仅在带有文本字段的上传/浏览按钮显示时起作用,否则上面的代码将不起作用
–山迪普
16年8月29日在8:02
上面的代码用于使用selenium和python上传文件,不适用于selenium + java。
– Siv P
18年7月17日在11:38
评论
是的,您可以使用以下命令来执行此操作:Actions act = new Actions(driver); act.clickAndHold(webelement).perform(); act.MoveToElement(element).Release();仅供参考:Draganddrop(element1,element2)命令在硒的早期版本中可用,但在较新的版本中不可用。我必须从桌面上传文件。 clickAndHold如何与之配合使用?