为了账号安全,请及时绑定邮箱和手机立即绑定

Selenium Java:无法通过自定义上传上传文件

Selenium Java:无法通过自定义上传上传文件

蛊毒传说 2022-10-20 17:13:17
我试图上传一个文件,但它引发了异常。上传按钮是定制的。我什至试图点击它,但它卡在那里。    new WebDriverWait(driver,100).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='divProfileSetting']/div/div/div/div[7]/div[2]/div/div/div/label/span")));    WebElement UploadingFile1 = driver.findElement(By.xpath("//div[@id='divProfileSetting']/div/div/div/div[7]/div[2]/div/div/div/label/span"));            //UploadingFile1.click();    UploadingFile1.sendKeys("E:\\Hatha.jpg");HTML:<div class="span12 logouploadContainer">    <input type="file" id="file" name="file" tabindex="-1" style="position: fixed; left: -9999px;">    <div class="bootstrap-filestyle" style="display: inline;" tabindex="0">        <input type="text" class="input-large" disabled="">         <label for="file" class="btn btn-primary">            <i class=" icon-white icon-folder-open" data-original-title="" title=""></i>             <span data-original-title="" title="">Choose File</span>        </label>    </div>    <div id="logo-div" class="hidden">        <button type="button" id="btnResetLogo" class="btn" style="margin-left: 5px;" data-original-title="" title="">Remove</button>        <div id="imgContainer" style="height: 100%; width: 100px; padding: 5px; overflow: hidden;">            <img alt="Client Logo" id="imgClient" src="">        </div>    </div></div>也尝试过等待元素,但似乎有一些问题。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

尝试使用 .sendKeys() 上传文件仅在与<input type=file>( https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file ) 一起使用时才有效。


查看您的代码,您正在尝试将文件信息发送到<span>元素。


而是尝试:


WebDriverWait wait = new WebDriverWait(driver, 15, 100);

WebElement uploadFileElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("file")));

uploadFileElement.sendKeys("E:\\Hatha.jpg");

这将等待<input type="file">元素变得可见,然后它将使用 sendKeys() 发送文件。如果永远不可见,这将不起作用<input type="file">,如果是这种情况,您可以通过使用 JavaScript 使其可见来解决问题,但这将是一种黑客行为,并不代表最终用户会做什么。


*编辑*


如果您决定采用 JavaScript hack 路线,您可以执行以下操作:


WebDriverWait wait = new WebDriverWait(driver, 15, 100);

WebElement uploadFileElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("file")));


JavascriptExecutor js = (JavascriptExecutor) driver;

js.executeScript("arguments[0].style.visibility='visible'", uploadFileElement);


uploadFileElement.sendKeys("E:\\Hatha.jpg");

请注意,预期条件现在等待元素存在于 DOM 中,而不是等待它可见,然后我们使用 JavaScript 显式地使元素可见,然后使用 sendKeys() 与它交互。


您可能不需要将您的潜水员对象转换为 JavascriptExecutor。如果您有 RemoteWebDriver、ChromeDriver 或 FirefoxDriver 的实例而不是 WebDriver 的实例,则该方法已经可用。


*编辑2 *


再看一遍,真正的问题是<input type="file">元素已被推离屏幕左侧。因此,修复是上述的变体。除了强制元素可见,我们可以使用 JavaScript 强制偏移量为 0 而不是 -9999px:


WebDriverWait wait = new WebDriverWait(driver, 15, 100);

WebElement uploadFileElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("file")));


JavascriptExecutor js = (JavascriptExecutor) driver;

js.executeScript("arguments[0].style.left='0'", uploadFileElement);


uploadFileElement.sendKeys("E:\\Hatha.jpg");


查看完整回答
反对 回复 2022-10-20
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

ElementNotInteractableException是在找到元素时引起的,但您无法与之交互。例如,您可能无法单击或发送密钥。

这可能有几个原因:

  1. 该元素不可见/不显示。

  2. 元素不在屏幕上。

  3. 该元素位于另一个元素的后面或隐藏。

  4. 用户首先需要执行一些其他操作才能启用它。

解决方案

等到元素可见/可点击

我看到你已经添加了,但它被配置为wait只等到. 因此,如果元素不在等待将结束。尝试至少将其增加到或取决于站点的速度。100mstimeoutinteractable100ms1 second i.e 1000ms


查看完整回答
反对 回复 2022-10-20
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信