【发布时间】:2020-02-25 23:37:28
【问题描述】:
我有一个类似这样的测试用例:
- 打开主页
- 如果没有内容存在
- 刷新页面
- 继续其他步骤...
这是代码的相关部分:
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 机器上运行 本地 时,事情正常,但是当它在 remote 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 here 刷新页面的方法,但没有一种方法有效。
似乎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();
}
编辑:
当我尝试使用 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 几乎一无所知,这可能是原因吗?
【问题讨论】:
-
您在 Jenkins 服务器上使用哪个版本的 Chrome?
-
它是 77.0.3865.40。
-
您是否尝试过您提供的链接中提到的所有方法? sendKeys.Keys , navigate.to() , sendKeys() , get()
-
是的,我都试过了。
-
你能在
driver.get(driver.getCurrentUrl()); waitForNoSpinner();之后叫它int broj = driver.findElements(By.cssSelector(".ng-scope")).size();吗
标签: linux selenium jenkins selenium-chromedriver x11