我正在使用带有TestNG的Selenium Grid来并行运行我的测试。我有一些需要用户登录的测试,因此我配置了一个用于测试的用户帐户。
我一直小心翼翼地确保任何涉及以我的测试用户身份登录的测试都在不同的虚拟机上运行,这样会话就不会中断,但是在调查了一些定期失败的测试之后,事实证明这还不够。因此,我要么:
为每个测试设置一个新用户(我知道这可能是理想的解决方案,但配置/运行需要一些时间。
拥有多个测试用户帐户,并确保一次只使用一个帐户。
如果我能识别运行测试的机器的主机,我可以相应地设置测试帐户。有没有办法做到这一点,还是有其他解决方案我没有想过?
答案 0 :(得分:1)
我通过设置“我是谁我的页面”解决了识别遥控器的问题。在我的远程webdriver(或Selenium)工厂中,我访问该页面,将其存储在我用来保存会话的类中,并记录它。此页面报告主机名,IP,浏览器类型和版本。
答案 1 :(得分:0)
我通过设置几个纯粹用于测试的唯一用户帐户解决了我的问题,所有用户帐户都以数字结尾(例如:selenium.test1)。使用Selenium作为一次性任务,这很容易自动化。
我将此号码存储在代码中,每次测试需要登录时,该号码会递增并构建用户名。
我确实考虑过“释放”,然后在测试完成后重新使用这些帐户,但我认为确保测试帐户有足够的测试帐户更容易。
答案 2 :(得分:0)
此处提供的另一种解决方案:
https://groups.google.com/forum/#!topic/selenium-users/8eNRW9JnayQ
public static String[] getHostNameAndPort(String hostName, int port, SessionId session) {
String[] hostAndPort = new String[2];
String errorMsg = "Failed to acquire remote webdriver node and port info. Root cause: ";
try {
HttpHost host = new HttpHost(hostName, port);
DefaultHttpClient client = new DefaultHttpClient();
URL sessionURL = new URL("http://" + hostName + ":" + port + "/grid/api/testsession?session=" + session);
BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest("POST",
sessionURL.toExternalForm());
HttpResponse response = client.execute(host, r);
JSONObject object = extractObject(response);
URL myURL = new URL(object.getString("proxyId"));
if ((myURL.getHost() != null) && (myURL.getPort() != -1)) {
hostAndPort[0] = myURL.getHost();
hostAndPort[1] = Integer.toString(myURL.getPort());
}
} catch (Exception e) {
logger.log(Level.SEVERE, errorMsg, e);
throw new RuntimeException(errorMsg, e);
}
return hostAndPort;
}