簡體   English   中英

當 sendKeys 不起作用時如何在 Selenium 中上傳文件

[英]How to upload a file in Selenium when sendKeys is not working

HTML 代碼屬於 shadow DOM 類型。

這是輸入類型:

<input hidden type="file" id="fileInput" accept=".doc,.docx,.pdf,.jpg,.png">

控制台截圖

您可以嘗試使用Selenium中的JavaScriptExecutor通過執行JavaScript腳本來使此元素不隱藏。 我在項目中做了這種事情,因為在IE中,SendKeys對於隱藏的輸入也不起作用。

您需要使用JS使輸入可見。 完整步驟如下所述:

// Find file input element
WebElement input = driver.findElement(By.cssSelector("input[type='file']"));

// Make sure element is visible
((JavascriptExecutor) driver).executeScript("arguments[0].style.display = 'block';", input);

// Specify you local file path here
input.sendKeys("/path/to/file/on/machine/which/runs/tests");

如果使用RemoteDriver,請不要忘記添加以下內容:

// Configure your client to upload local files to remote Selenium instance
    driver.setFileDetector(new LocalFileDetector());

注意:文件路徑應該是絕對的。 您可以通過以下方式實現:

String getFilePath(String filePath) {
    new File(filePath).absolutePath
}

如果類型文件位於 shadowroot 中,則您當前無法使用 selenium 訪問它。

這與字段不可見無關

通常,您可以執行以下操作:

$el = $driver->findElements(\WebDriverBy::xpath('//*[@type="file"]')
$el->setFileDetector(new \LocalFileDetector());
$el->sendKeys($imagepath);

// or mink:
$el = $driver->getPage()->findAll('xpath', '//*[@type="file"]');
$el->attachFile($path);

但是,如果它在 shadow-root 中,在控制台中使用它不會找到它:

$x('//*[@type="file"]')

這也不會:

$("input[type='file']")

可以通過js檢查輸入元素並右鍵獲取元素,大概會得到這樣的元素路徑

document.querySelector("body > something").shadowRoot.querySelector("div > div > something").shadowRoot.querySelector("#someid")

這意味着它只能通過影子根訪問,並且可以使用上面的 javascript 來完成

Selenium Javascript 無法返回元素(但如果 selenium 可以獲取元素,則可以如上所示進行上傳) Javascript 將不允許您上傳,因為它不安全(但您可以從上面的 js 中獲取元素)

但問題是,您不能將 javascript 元素作為 php selenium 元素返回。 所以 2 沒有辦法一起工作。

真正的問題是,硒還不支持影子根

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM