У меня есть тестовый пример, который выглядит примерно так:
- открыть домашнюю страницу
- если нет контента
- обновить страницу
- продолжить с другими шагами...
Это соответствующая часть кода:
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, может ли это быть причиной этого?
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);
}
}
}
driver.navigate().refresh();
ничего не делает. Это основано не только на значении broj
, но и на снимках экрана.
Похожие вопросы
Связанные вопросы
Новые вопросы
linux
ВНИМАНИЕ: Все вопросы по Linux должны быть связаны с программированием; те, которые не будут закрыты. Используйте этот тег, только если ваш вопрос касается программирования с использованием API-интерфейсов Linux или поведения, специфичного для Linux, а не только потому, что вы запускаете свой код в Linux. Если вам нужна поддержка Linux, вы можете попробовать https://unix.stackexchange.com или сайт Stack Exchange конкретного дистрибутива Linux, например https://askubuntu.com или https://elementaryos.stackexchange.com/.
int broj = driver.findElements(By.cssSelector(".ng-scope")).size();
послеdriver.get(driver.getCurrentUrl()); waitForNoSpinner();