Правильный способ получить список загруженных файлов Chrome - PullRequest
0 голосов
/ 09 ноября 2019

Я написал метод получения списка загруженных файлов 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; 
}
...