以下是我的情景:
我们在selenium网格上运行我们的selenium测试套件,该网格是在jenkins的docker容器(linux box)中设置的。
在我的一次测试中,当我点击导出选项时,它会在selenium网格上下载一个excel文件。
问题:
我无法找到下载文件的位置(每次测试都可以在selenium网格中的不同节点中运行)。
我的期待:
有人可以帮助我,如何找到文件的位置,我想我无法在linux框中打开excel文件,所以如果我可以将该文件移动到SFTP位置之一,那么我可以连接到SFTP并且可以读取用于验证的内容。
由于
答案 0 :(得分:2)
假设:
您首先需要确定您的网格将测试执行路由到哪个节点。为此,您将使用下面的技术来检索此信息(我最初将其作为gist here发布,然后写了一篇关于此here的博客,最后构建了一个名为{{的库3}}提供开箱即用的这种功能,而无需编写任何额外的代码量)
public class GridInfoExtracter {
private 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;
}
private static JSONObject extractObject(HttpResponse resp) throws IOException, JSONException {
BufferedReader rd = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));
StringBuffer s = new StringBuffer();
String line;
while ((line = rd.readLine()) != null) {
s.append(line);
}
rd.close();
JSONObject objToReturn = new JSONObject(s.toString());
return objToReturn;
}
}
现在您将拥有运行测试的Docker节点的IP和端口信息。
您现在有两个选择:
答案 1 :(得分:0)
需要共享一种方法来检查文件是否已下载到硒网格节点中的特定位置(下载位置需要在chrome选项或firefox配置文件中指定)并检查文件是否位于指定的下载目录中:
(Python中的书面代码)
例如,传递下载目录和下载文件名,我将C:\ File_Download设置为我的下载目录,并从应用程序捕获下载的文件名并检查下载的相同文件:
注意:使用机器人框架内置库获取会话ID,SSH以连接到远程计算机并在远程计算机中创建硒网格节点。
import requests, json
from robot.libraries.BuiltIn import BuiltIn
import paramiko
def check_downloaded_file_present_in_remote_machine(dir_location, filename):
session_id = BuiltIn().get_library_instance('SeleniumLibrary')._current_browser().session_id
response = requests.get("http://{SeleniumHubIP}:{port}/grid/api/testsession?",params=
{'session':session_id})
json_resp = response.json()
ip_addr = json_resp['proxyId'].split('://')[1].split(':')[0]
print ip_addr
client = paramiko.SSHClient()
client.load_host_keys('{home\user_directory}\.ssh\known_hosts')
client.connect(hostname=ip_addr,port=22,username='XXXXX',password='XXXX',look_for_keys=True)
stdin, stdout, stderr = client.exec_command('cd ' +dir_location+' && ls')
Is_file_exist = False
for line in stdout:
print(line.strip('\n'))
if filename in line.strip('\n'):
Is_file_exist = True
client.exec_command('cd '+dir_location+' && rm -rf *')
client.close()
return Is_file_exist