【问题标题】:Upload files to site automatically without browser focus自动将文件上传到站点,无需浏览器焦点
【发布时间】:2018-10-18 11:55:01
【问题描述】:

我致力于测试脚本以自动将文件上传到站点并以无头模式执行脚本。它需要一个一个上传文件列表,我是基于Selenium WebDriver开发的。我使用AutoIT 脚本来处理对话窗口、文件选择器窗口。参数$CmdLine[1]包含实际文件的路径。

ControlFocus("Open a file","","Edit1")
ControlSetText("Open a file","","Edit1", $CmdLine[1])
ControlClick("Open a file","","Button1")

使用以下代码执行:

Runtime.getRuntime().exec(autoITExecutable);

它会打开对话窗口,因此如果不关注浏览器窗口就无法工作。 java.awt.Robot 类的作用类似,需要关注浏览器窗口。

我也尝试使用sendKeys() 方法,但是输入字段无法以这种方式处理文件。 Katalon Studio 也无法处理该字段。

具有相似形式的示例网站:

http://ajaxuploader.com/demo/simple-upload.aspx

https://ec.europa.eu/cefdigital/DSS/webapp-demo/validation

https://tus.io/demo.html

【问题讨论】:

    标签: java selenium selenium-webdriver headless katalon-studio


    【解决方案1】:

    你可以试试下面的代码:

    // wait for the window to appear
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.alertIsPresent());
    
    // switch to the file upload window
    Alert alert = driver.switchTo().alert();
    
    // enter the filename
    alert.sendKeys(fileName);
    
    // hit enter
    Robot r = new Robot();
    r.keyPress(KeyEvent.VK_ENTER);
    r.keyRelease(KeyEvent.VK_ENTER);
    
    // switch back
    driver.switchTo().activeElement();
    

    【讨论】:

    • 我明白了,但是如果文件选择器窗口没有打开,则没有地方可以粘贴文件路径。
    • 当您单击“选择文件”按钮时,将打开操作系统本机文件选择对话框。您的驱动程序将无法识别此对话框,因此在 Selenium 中上传任何文件时,您不应单击“选择文件”按钮。相反,只需使用 sendkeys 选择文件,WebElement El = driver.findElement(By.id("'fileUploadField'")); el.sendKeys("c:\\temp\\abc.txt");
    • 这些网站对我不起作用。你能举一个工作的例子吗?也许对于这个网站:ec.europa.eu/cefdigital/DSS/webapp-demo/validation?
    【解决方案2】:

    试试这个,

    webElement.sendKeys(System.getProperty("user.dir") + "file path");
    

    这里,

    • webElement 是为文件上传确定的元素。请确保输入元素可见。
    • 尝试将文件路径指定为我们要上传的内容的相对路径。

    确保您没有点击浏览按钮,点击浏览按钮将打开 Windows 对话框,其中 selenium webDriver 将不起作用。

    【讨论】:

    【解决方案3】:

    直接使用 Selenium:

    driver().findElement(By.id("ContentPlaceHolder1_Uploader1__Insert")).sendKeys(pathToFile);

    这样你可以避免使用系统依赖对话框。

    【讨论】:

    • 是的,我已经尝试过了,但正如我在问题中提到的那样,它不适用于该字段。
    • 那我没明白你的问题,AutoIt 代码有什么问题?您是否转义了 AutoIT 保留字符?你也可以使用Send($CmdLine[1])
    • 你也可以尝试在 Selenium 中使用纯 Javascript:driver.executeScript("document.querySelector('input#myId').files = new Array('"+pathToFile+"')";
    • AutoIT 正在工作,但需要浏览器焦点,不适合在无头模式下执行它或根本不关注浏览器。
    • 你能举个例子吗?也许对于这个网站:ec.europa.eu/cefdigital/DSS/webapp-demo/validation?
    猜你喜欢
    • 2013-03-28
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2010-09-20
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多