![](/img/trans.png)
[英]Selenium webdriver error when trying to lunch tests on a remote machine
[英]Accessing data on remote machine's clipboard when running tests using selenium-webdriver
我有一個設置如下:
Machine 1 - Ubuntu - selenium hub
Machine 2 - Ubuntu - selenium node
Machine 3 - Windows 8.1 - selenium node
為了執行測試,我使用 RemoteWebDriver 並在集線器上配置了 Jenkins CI。
問題:我正在測試的 URL 有一個按鈕,可以在單擊時將數據復制到剪貼板。 除非粘貼,否則最終用戶看不到數據。 我擔心的是在本地運行時,我能夠使用以下方法獲取系統剪貼板數據:
strScript = (String) Toolkit.getDefaultToolkit().getSystemClipboard()
.getData(DataFlavor.stringFlavor);
但是當在遠程機器上從 jenkins 觸發代碼時,我無法獲取內容並收到以下錯誤:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
很明顯它正在嘗試在 jenkins 服務器上獲取數據,但某些顯示問題。 但我的要求是在單擊按鈕后獲取存儲在遠程機器上的數據。
任何解決方案?
謝謝。
如果 Selenium Grid 環境在您的控制之下,並且您可以奢侈地設置節點,那么這里是您構建它的方法。
下面的示例應該在實際中解釋所有這些(我使用的是 selenium 3.141.59)
正在使用的依賴項
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>com.rationaleemotions</groupId>
<artifactId>talk2grid</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
</dependency>
自定義 servlet 如下所示
package com.rationaleemotions.servlets;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openqa.selenium.json.Json;
public class ClipboardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setStatus(200);
try {
String text = Toolkit.getDefaultToolkit().getSystemClipboard()
.getData(DataFlavor.stringFlavor)
.toString();
Map<String, String> map = new HashMap<>();
map.put("contents", text);
response.getWriter().append(new Json().toJson(map));
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
}
}
}
這里假設我們的 servlet 屬於名為“servlets.jar”的 jar。 這是您從節點開始的方式
java -cp servlets:selenium-server-standalone-3.141.59.jar org.openqa.grid.selenium.GridLauncherV3 -role node -servlets com.rationaleemotions.servlets.ClipboardServlet
使用命令啟動集線器
java -jar selenium-server-standalone-3.141.59.jar -role hub
這是一個將使用所有這些的示例。
package com.rationaleemotions;
import com.rationaleemotions.pojos.Host;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.json.Json;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class ClipboardSample {
private RemoteWebDriver driver;
@BeforeClass
public void beforeClass() throws MalformedURLException {
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),
DesiredCapabilities.chrome());
}
@Test
public void demo() throws Exception {
String text = "Mussum ipsum cacilds, vidis litro abertis. Consetis adipiscings elitis. Pra lá , depois divoltis porris, paradis. Paisis, filhis, espiritis santis. Mé faiz elementum girarzis, nisi eros vermeio, in elementis mé pra quem é amistosis quis leo. Manduma pindureta quium dia nois paga.";
driver.navigate().to("https://googlechrome.github.io/samples/async-clipboard/");
driver.findElement(By.cssSelector("textarea#out")).sendKeys(text);
TimeUnit.SECONDS.sleep(1);
takeScreenshot();
driver.findElement(By.cssSelector("button#copy")).click();
TimeUnit.SECONDS.sleep(1);
Host grid = new Host("localhost", "4444");
Host node = new GridApiAssistant(grid)
.getNodeDetailsForSession(driver.getSessionId().toString());
String url = String
.format("http://%s:%d/extra/ClipboardServlet", node.getIpAddress(), node.getPort());
Request request = new Request.Builder().url(url).build();
Call call = new OkHttpClient.Builder().build().newCall(request);
Response response = call.execute();
String localClipboardData = response.body().string();
Map<String, String> data = new Json().toType(localClipboardData, Map.class);
Assert.assertEquals(text, data.get("contents"));
}
private void takeScreenshot() throws IOException {
File src = driver.getScreenshotAs(OutputType.FILE);
File target = new File(
System.getProperty("user.dir") + File.separator + "target" + File.separator +
"screenshot.jpg");
FileUtils.copyFile(src, target);
}
@AfterClass
public void afterClass() {
if (driver != null) {
driver.quit();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.