是否可以使用TestNG自动将系统中的文件拖放到硒中的网站?与我们在Gmail中可以通过拖放操作发送附件的方式一样吗?请提出建议。

评论

是的,您可以使用以下命令来执行此操作:Actions act = new Actions(driver); act.clickAndHold(webelement).perform(); act.MoveToElement(element).Release();仅供参考:Draganddrop(element1,element2)命令在硒的早期版本中可用,但在较新的版本中不可用。

我必须从桌面上传文件。 clickAndHold如何与之配合使用?

#1 楼

是的,可以通过脚本注入使用Selenium删除文件。该脚本需要创建一个<input> Web元素以接收SendKeys发送的文件。然后使用在dragenter对象中设置的文件在目标元素上模拟dragoverdropdataTransfer事件。

本示例将文件系统中的图像拖放到放置区域:

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