Selenium web驱动程序的文件上传功能,适用于没有AutoIt或Skuliii的非输入按钮



我需要使用Chromedriver通过Selenium WebDriver上传一个文档。我尝试过所有Action类和JavaScript的东西,但都不起作用。我假设它们不起作用,因为它们依赖于按钮作为输入字段,然而,我正在处理的上传按钮不是。它的HTML看起来像这样:

复制步骤:

  • 转到:https://www.fedex.com/apps/printonline/#
  • 单击营销材料下的查看产品
  • 单击手册下的"入门">
  • 单击使用您的文件上传文件

使用您的文件

我可以点击"使用你的文件"按钮,但我不确定如何上传文件。

driver.get("https://www.fedex.com/apps/printonline/#!");
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
//Thread.sleep(6000);
if (driver.findElement(By.xpath("//area[@alt='close']")) != null) {
driver.findElement(By.xpath("//area[@alt='close']")).click();
}
driver.findElement(By.xpath("//a[@title='Marketing Materials']/child::button")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//a[@title='Get Started - Brochures']")).click();
Thread.sleep(1000);
WebElement element = driver.findElement(By.xpath("//*[@class='btn fxg-btn-orange  mycomputer-upload-link']"));
((JavascriptExecutor)driver).executeScript("arguments[0].click()", element);

好的,所以首先要去掉那些Thread.sleep(),使用流畅的等待和轮询时间,最好作为定位元素的函数:

private WebElement waitFor(By locator) {
int timeout = 10;
FluentWait<WebDriver> wait = new FluentWait<>(driver)
.pollingEvery(Duration.ofMillis(200))
.withTimeout(Duration.ofSeconds(timeout))
.ignoring(NoSuchElementException.class);
return wait.until((driver) -> driver.findElement(locator));
}

然后你可以点击按钮并上传如下文件:

waitFor(By.cssSelector("button.view-products")).click();
waitFor(By.cssSelector("a.get-started")).click();
waitFor(By.cssSelector("a.get-started")).click();
waitFor(By.cssSelector("input.file-upload")).sendKeys("path_to_my_file");

请注意,我正在使用input元素上传文件——我没有单击a链接,因为您不需要这样做。只需将路径直接发送到输入元素即可。

最新更新