首页 文章

RobotFramework Selenium2Library和外部库 - 传递webdriver?

提问于
浏览
2

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

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

谢谢您的意见!

1 回答

  • 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
    

相关问题