0

我正在使用 Windows 机器的网格配置构建测试自动化框架。在不涉及太多不必要的细节的情况下,我在运行带有 Selenium2Library 的 Robot Framework 的服务器上运行测试,该服务器通过一个集线器运行测试会话,该集线器根据我选择的浏览器和操作系统选择一个节点。标准的东西,一切正常;但是有时测试挂起或发生无法解释的事情,我想 RDP 到运行测试的节点,看看是什么。

如果我可以在测试日志中或通过 Python 以编程方式嵌入集线器选择用于测试执行的 Webdriver 节点的机器名称或 IP,那就太好了。我知道这个 Python 代码返回了 Windows 的机器名称:

import socket
nodeName=socket.gethostname()

但是当然,当您在测试脚本中执行它时,它会返回运行脚本的服务器的名称,而不是运行测试会话的节点的名称。

有谁知道我该怎么做?谢谢。

4

1 回答 1

3

您可以使用 API 从集线器获取节点的 URL。然后你只需要解析 URL 并提取主机部分。虽然 WebDriver 确实存储中心 URL,但它是在私有属性中存储的。我会尊重这一点,因此此关键字要求您传入中心 URL:

import urllib2, json
from robot.libraries.BuiltIn import BuiltIn
from robot.api import logger
from urlparse import urlparse, urljoin


class Selenium2LibraryExt(object):    

    def get_node_hostname(self, hub_url):
        '''Returns the hostname/IP of the node associated with the current browser.

        `hub_url` should be the URL of the Grid hub.
        '''
        session_id = BuiltIn().get_library_instance('Selenium2Library')._current_browser().session_id
        fragment = '/grid/api/testsession?session=%s' % session_id
        query_url = urljoin(hub_url, fragment)
        req = urllib2.Request(url=query_url)
        resp = urllib2.urlopen(req).read()
        logger.debug('GET of %s returned:\n%s' % (query_url, resp))
        json_blob = json.loads(resp)
        if 'proxyId' in json_blob:
            proxy_id = json_blob['proxyId']
            logger.info('Selenium session is executing on %s' % proxy_id)
            parse_result = urlparse(proxy_id)
            return parse_result.hostname
        else:
            raise Exception('Failed to get hostname. Is Selenium running locally? hub response: %s' % resp)

在我使用的这个关键字的版本中,我从全局变量中检索 URL,而不是像上面那样使用参数。

hub_url = BuiltIn().replace_variables('${SELENIUM GRID URL}')
于 2013-08-16T18:35:32.023 回答