【问题标题】:RobotFramework Selenium2Library and External Libraries- pass webdriver?RobotFramework Selenium2Library 和外部库 - 通过 webdriver?
【发布时间】:2013-08-15 17:39:36
【问题描述】:

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

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

感谢您的意见!

【问题讨论】:

    标签: robotframework


    【解决方案1】:

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

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

    这是一个带有关键字的库,该关键字将使用反射来访问 WebDriverCache 并公开它:

    // 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 关键字与 Misc 中的关键字混合使用:

    *** 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(继承),这里有一个示例:

    // default package
    import org.openqa.selenium.WebDriver;
    
    
    public class MySelenium2Library extends Selenium2Library
    {
        public WebDriver getCurrentBrowser() {
            return this.webDriverCache.getCurrent();
        }
    }
    

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

    *** 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
    

    【讨论】:

    • 我能问一下首选的方法是什么(继承或反射),为什么?
    猜你喜欢
    • 2018-02-04
    • 2017-04-16
    • 2014-11-04
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多