Я написал метод получения списка загруженных файлов Chrome через Selenium с помощью Chromedriver. Работает нормально. Теперь его нужно запускать на Selenium удаленно. Обратите внимание, что в Selenium, который работает от концентратора до подчиненного, у меня нет доступа к просмотру xpaths. Во всяком случае, иногда это работает, а иногда нет. Метод идет в chrome: // загружает и использует расширение теневого корня (которое я нашел на другом сайте). Я вставил несколько спящих мест, чтобы вы могли видеть экран chrome: // downloads. Получив файлы, он возвращается к предыдущему экрану. Хотя я не могу получить доступ к Chrome, работающему на селене, я могу просмотреть его и увидеть список загруженных файлов. Но Java не находит его.
Я вижу эту ошибку javascript, но не знаю точно, что ее вызывает?
Ошибка javascript: b.getElementsByTagName не является функцией
Я думаю, может быть, иногда xpath отличается, но у меня нет возможности проверить. Вот метод, который я написал. Кто-нибудь еще написал такой метод?
public static List<String> getChromeDownloadFiles(WebDriver driver) {
// Get the current windows
String handle = driver.getWindowHandle();
ArrayList<String> otabs = new ArrayList<String> (driver.getWindowHandles());
int sz = otabs.size();
// Open a new TAB
((JavascriptExecutor) driver).executeScript("window.open();");
ArrayList<String> ltabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(ltabs.get(sz));
driver.get("chrome://downloads/");
List<String> res = new ArrayList<>();
try {
Thread.sleep(20000);
} catch (InterruptedException e1) {
}
try {
// This uses #shadow-root elements which are a bit tricky and need to be found and expanded
WebElement root1 = driver.findElement(By.tagName("downloads-manager"));
WebElement shadowRoot1 = expandRootElement(driver, root1);
WebElement ironList = shadowRoot1.findElement(By.tagName("iron-list"));
Thread.sleep(10000);
List<WebElement> fileElements = ironList.findElements(By.tagName("downloads-item"));
for (WebElement e : fileElements) {
WebElement sh = expandRootElement(driver, e);
List<WebElement> divs = sh.findElements(By.tagName("div"));
WebElement div = null;
for (WebElement d : divs) {
if (d.getAttribute("id").contentEquals("content")) {
div = d;
break;
}
}
WebElement imgEle = div.findElement(By.xpath(".//img[@class='icon']"));
String src = imgEle.getAttribute("src");
String pt1 = src.replaceAll("chrome.*path=", "");
String[] split = pt1.split("&");
String ptraw = split[0];
// the uri is encoded so it must be decoded. Unfortunately, decoding does not
// replace "+" with " "
URI uri = new URI(ptraw);
String p = uri.getPath();
p = p.replace("+", " ");
res.add(p);
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
// Go to the previous
driver.close();
driver.switchTo().window(handle);
return res;
}