2 回答
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");
TA贡献1799条经验 获得超6个赞
ElementNotInteractableException
是在找到元素时引起的,但您无法与之交互。例如,您可能无法单击或发送密钥。
这可能有几个原因:
该元素不可见/不显示。
元素不在屏幕上。
该元素位于另一个元素的后面或隐藏。
用户首先需要执行一些其他操作才能启用它。
解决方案
等到元素可见/可点击
我看到你已经添加了,但它被配置为wait
只等到. 因此,如果元素不在等待将结束。尝试至少将其增加到或取决于站点的速度。100ms
timeout
interactable
100ms
1 second i.e 1000ms
添加回答
举报