У меня есть тестовый пример, который выглядит примерно так:

  • открыть домашнюю страницу
  • если нет контента
  • обновить страницу
  • продолжить с другими шагами...

Это соответствующая часть кода:

public JpoPO() {
        driver.get(Settings.JPO_TEST_URL);
        PageFactory.initElements(driver, this);
        System.out.println("[INFO] Homepage initialized.");
        zatvoriModal();
        refreshIfNeeded();
        zatvoriModal();
        (new WebDriverWait(driver, 30)).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("#loading")));
        System.out.println("[DEBUG] broj .ng-scope elemenata: " +driver.findElements(By.cssSelector(".ng-scope")).size());
        System.out.println("[OK] JpoPO() initialized.");
}

А это часть refreshIfNeeded():

public void refreshIfNeeded() {
    if(System.getProperty("os.name").equals("Linux")){
        System.out.println("### A"+now());
        int broj = driver.findElements(By.cssSelector(".ng-scope")).size();
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("location.reload()");
        //driver.findElement(By.cssSelector("header")).sendKeys(Keys.F5);
        driver.get(driver.getCurrentUrl());
        waitForNoSpinner();
        System.out.println("[DEBUG] location reloaded, .ng-scope elements: "+broj);
        System.out.println("### B"+now());
    }else{
        System.out.println("[] Starting refreshIfNeeded()");
        Date ts1 = new Date();
        int count = 0;
        while (driver.findElements(By.cssSelector(".ng-scope")).size()==0 && count < 10){
            driver.navigate().refresh();
            zatvoriModal();
            try {
                (new WebDriverWait(driver, 10)).until(ExpectedConditions.numberOfElementsToBeMoreThan(By.cssSelector(".ng-scope"), 0));
                Date ts2 = new Date();
                long trajanje = ts2.getTime() - ts1.getTime();
                System.out.println(String.format("[INFO] Učitavanje sadržaja: %s ms.", trajanje));
            } catch (Exception e){
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            System.out.println("[] Count: "+count);
            count++;
        }
    }
}

Эта штука работает при запуске локально на моей машине с Windows, но когда она работает на удаленной машине с Jenkins linux, обновление не появляется работать.

Это вывод консоли Jenkins:

16:18:48 [INFO] Homepage initialized.
16:18:48 ### A2019-10-30T16:18:48.904
16:18:49 [INFO] Spinner (ili uvjet čekanja) je trajao: 117 ms. (waitForNoSpinner-try)
16:18:49 [INFO] Spinner (ili uvjet čekanja) je trajao: 89 ms. (waitForNoSpinner-finally)
16:18:49 [DEBUG] location reloaded, .ng-scope elements: 0
16:18:49 ### B2019-10-30T16:18:49.417
16:18:49 [DEBUG] broj .ng-scope elemenata: 0
16:18:49 [OK] JpoPO() initialized.

Тест завершается ошибкой на следующем шаге при попытке найти элемент, которого нет, пока страница не будет обновлена. Это также подтверждается использованием скриншотов, которыми я не могу поделиться.

Существует несколько способов обновления страницы с помощью Selenium здесь< /a>, но ни один из них не работает.

Просто кажется, что ни js.executeScript("location.reload()"), ни driver.navigate().refresh() не работают.

Я использую следующие параметры Chromedriver:

if(System.getProperty("os.name").equals("Linux")){
    options.addArguments("--headless");
    options.addArguments("--proxy-server='direct://'");
    options.addArguments("--proxy-bypass-list=*");
    options.addArguments("--window-size=1200,800");
    WebDriverManager.chromedriver().version("77.0.3865.40").setup();
}


< Сильный > EDIT :

Когда я пытался обновить с помощью класса Robot, я получал java.awt.AWTException: headless environment, поэтому я добавил System.setProperty("java.awt.headless", "false"); в свой код.

Теперь я получаю

java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

Я почти ничего не знаю о Linux, может ли это быть причиной этого?

3
Mate Mrše 30 Окт 2019 в 18:56
Какую версию Chrome вы используете на сервере Jenkins?
 – 
Greg Burghardt
30 Окт 2019 в 20:24
Это 77.0.3865.40.
 – 
Mate Mrše
30 Окт 2019 в 21:42
Вы пробовали все способы, указанные в ссылке, которую вы дали? sendKeys.Keys, navigation.to(), sendKeys(), get()
 – 
Durga Prasad Behera
11 Ноя 2019 в 07:14
Да, я пробовал их все.
 – 
Mate Mrše
11 Ноя 2019 в 10:44
Вы можете попробовать назвать его int broj = driver.findElements(By.cssSelector(".ng-scope")).size(); после driver.get(driver.getCurrentUrl()); waitForNoSpinner();
 – 
Durga Prasad Behera
11 Ноя 2019 в 12:10

1 ответ

Вы сохраняете размер элементов .ng-scope до обновления и не получаете размер после. Это причина, по которой вы получаете 0 в журналах. Вы должны искать элементы после waitForNoSpinner, чтобы получить значение размера обновления:

if(System.getProperty("os.name").equals("Linux")){
    System.out.println("### A"+now());
    int broj = driver.findElements(By.cssSelector(".ng-scope")).size();
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("location.reload()");
    //driver.findElement(By.cssSelector("header")).sendKeys(Keys.F5);
    driver.get(driver.getCurrentUrl());
    waitForNoSpinner();
    broj = wait.until(ExpectedConditions.numberOfElementsToBeMoreThan(By.cssSelector(".ng-scope"), 0)).size();
    System.out.println("[DEBUG] location reloaded, .ng-scope elements: "+ broj);
    System.out.println("### B"+now());
}

Вот альтернативный метод refreshIfNeeded, где waitForNoSpinner и zatvoriModal в зависимости от ОС. Если между waitForNoSpinner и zatvoriModal нет разницы, замените if одним из них. Метод выдаст TimeoutException, если .ng-scope не будет найден через 20 секунд:

public void refreshIfNeeded() {
    WebDriverWait wait = new WebDriverWait(driver, 20, 1000);

    System.out.println("[DEBUG] check .ng-scope elements and refresh if not located");

    wait.until(d -> {
        if (d.findElements(By.cssSelector(".ng-scope")).isEmpty()) {
            System.out.println("[DEBUG] no .ng-scope elements, refresh..");
            driver.navigate().refresh();
            waitForNoSpinner();
            /*if (System.getProperty("os.name").equals("Linux")) {
                waitForNoSpinner();
            } else {
               zatvoriModal();
            }*/
        }
        return !d.findElements(By.cssSelector(".ng-scope")).isEmpty();
    });

    System.out.println("[DEBUG] .ng-scope elements: " + driver.findElements(By.cssSelector(".ng-scope")).size());
}

С петлей:

public void refreshIfNeeded() throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 20, 1000);

    System.out.println("[DEBUG] check .ng-scope elements and refresh if not located");

    for (int i=0; i < 10; i++) {
        try {
            wait.until(d -> {
                if (d.findElements(By.cssSelector(".ng-scope")).isEmpty()) {
                    System.out.println("[DEBUG] no .ng-scope elements, refresh..");
                    driver.navigate().refresh();
                    if (System.getProperty("os.name").equals("Linux")) {
                        waitForNoSpinner();
                    } else {
                        zatvoriModal();
                    }
                }
                return !d.findElements(By.cssSelector(".ng-scope")).isEmpty();
            });
            break;
        } catch (Exception e) {
            Thread.sleep(3000);
        }
    }
}
0
Sers 11 Ноя 2019 в 17:25
Проблема в том, что driver.navigate().refresh(); ничего не делает. Это основано не только на значении broj, но и на снимках экрана.
 – 
Mate Mrše
11 Ноя 2019 в 17:13
Можешь поделиться скриншотами? Почему вам требуется обновление?
 – 
Sers
11 Ноя 2019 в 17:17
У вас есть доступ к веб-странице Дженкинса?
 – 
Sers
11 Ноя 2019 в 18:02
 – 
Sers
11 Ноя 2019 в 18:36