首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RobotFramework Selenium2Library和外部库-通过and驱动程序?

RobotFramework Selenium2Library和外部库-通过and驱动程序?
EN

Stack Overflow用户
提问于 2013-08-14 06:34:41
回答 1查看 4.8K关注 0票数 2

我已经创建了一个Java库,它利用了Selenium Web Driver的一个实例。我想运行我用这个库以及Selenium2Library编写的测试。在某种程度上,Java Library会添加一些我需要的功能(使用Ajax元素),但是大部分测试都可以用Selenium2关键字编写。

有没有办法将在Selenium2Library中实例化的way驱动程序传递给我的外部库,以便它们可以运行相同的测试?

感谢您的投入!

EN

回答 1

Stack Overflow用户

发布于 2013-08-16 04:24:52

当前浏览器存储在受保护的WebDriverCache字段中。您可以扩展Selenium2Library并公开WebDriver,但我认为在这个简单的用例中,最好使用反射。这样,您就可以使用原始的Selenium2Library。其他人可能会有不同的感受。我将演示这两种方法。

这两种解决方案都提供了一个Get Current浏览器关键字,您可以从中获取结果并将其传递到库的构造函数中,等等。

下面是一个包含关键字的库,该关键字将使用反射来访问WebDriverCache并公开它:

代码语言:javascript
复制
// default package
import java.lang.reflect.Field;

import org.openqa.selenium.WebDriver;
import org.robotframework.selenium2library.keywords.BrowserManagement;
import org.robotframework.selenium2library.utils.WebDriverCache;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Misc {
    public static void goToGoogle() {
        getCurrentBrowser().get("http://www.google.com");
    }

    public static WebDriverCache getWebDriverCache() {
        try
        {
            BrowserManagement bm = (BrowserManagement) getLibraryInstance("Selenium2Library");
            Field cacheField = BrowserManagement.class.getDeclaredField("webDriverCache");
            cacheField.setAccessible(true);
            return (WebDriverCache) cacheField.get(bm);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static WebDriver getCurrentBrowser() {
        return getWebDriverCache().getCurrent();
    }

    private static Object getLibraryInstance(String library) throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");
        engine.put("library", library);
        engine.eval("from robot.libraries.BuiltIn import BuiltIn");
        engine.eval("instance = BuiltIn().get_library_instance(library)");
        return engine.get("instance");
    }
}

下面你可以看到它是如何使用的,混合了Selenium2Library关键字和其他关键字:

代码语言:javascript
复制
*** Settings ***
Test Teardown    Close All Browsers
Library    Selenium2Library
Library    Misc

*** Test Cases ***
Get Current Browser Test
    Open Browser    http://slashdot.org
    Go To Google
    Title Should Be    Google

如果您希望改用自定义Selenium2Library (继承),下面是一个示例:

代码语言:javascript
复制
// default package
import org.openqa.selenium.WebDriver;


public class MySelenium2Library extends Selenium2Library
{
    public WebDriver getCurrentBrowser() {
        return this.webDriverCache.getCurrent();
    }
}

直接从Robot Framework与WebDriver实例交互,使示例更简单:

代码语言:javascript
复制
*** Settings ***
Test Teardown    Close All Browsers
Library    MySelenium2Library

*** Test Cases ***
Get Current Browser Test
    Open Browser    http://slashdot.org
    ${driver}=    Get Current Browser
    Call Method    ${driver}    get    http://www.google.com
    Title Should Be    Google
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18220386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档