gpt4 book ai didi

linux - Selenium 不会刷新 Jenkins 上的页面

转载 作者:行者123 更新时间:2023-12-04 08:09:16 33 4
gpt4 key购买 nike

我有一个这样的测试用例:

  • 打开主页
  • 如果没有内容
  • 刷新页面
  • 继续其他步骤...

这是代码的相关部分:

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 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 几乎一无所知,难道这就是原因吗?

最佳答案

您在刷新之前存储 .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 方法,其中waitForNoSpinnerzatvoriModal 基于操作系统。如果 waitForNoSpinnerzatvoriModal 之间没有区别,则将 if 替换为其中之一。如果在 20 秒后找不到 .ng-scope,方法将抛出 TimeoutException:

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);
}
}
}

关于linux - Selenium 不会刷新 Jenkins 上的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58629302/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com