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
添加回答
舉報