在RobotFramework中扩展selenium2library WebElement

时间:2016-12-01 20:50:19

标签: java python-3.x automated-tests robotframework selenium2library

我是RobotFramework的新手(实际上是为一个新的测试自动化项目进行评估)。

过去,我总是使用Java和页面对象创建自己的小框架,但这次我想知道我是否可以使用现有的框架。我正在评估Spock和Robot Framework。

我的要求是测试Web应用程序,Windows对象和移动应用程序,因此Robot绝对优于Spock。另外我希望任何一天都能使用Python而不是Groovy。

我通常使用以下代码在我的框架中扩展WebElement。我想知道是否有可能在Robot Framework中做这些事情。

//importing webdriver and other selenium libraries
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.internal.Coordinates;
import org.openqa.selenium.internal.Locatable;
import org.openqa.selenium.internal.WrapsElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;

//interface that will be implemented by my custom web element
interface MyElement extends WebElement, WrapsElement, Locatable {

}

//my custom web element class
public class MyWebElement implements MyElement {

    private WebElement element;

    //private constructor for my web element class
    private MyWebElement(WebElement element) {
        this.element = element;
    }

    //public factory method for my web element class
    public static MyWebElement getInstance(By by) {
        WebElement element = MyWebDriver.getInstance().findElement(by);
        MyWebElement myWebElement = new MyWebElement(element);
        return myWebElement;
    }

    //overriding WebElement method click
    @Override
    public void click() {
        waitUntilClickable();
        element.click();
    }

    //adding method waitUntilClickable to my web element
    public MyWebElement waitUntilClickable() {
        return waitUntilClickable(MyWebDriver.getTimeoutElementInMilliseconds(),
                MyWebDriver.getPollingElementInMilliseconds());
    }

    //adding helper method to implement waitUntilClickable
    public MyWebElement waitUntilClickable(long timeOutInMilliseconds,
            long pollingIntervalInMilliseconds) {
        Wait<WebDriver> wait = new FluentWait<WebDriver>(MyWebDriver.getInstance())
                .withTimeout(timeOutInMilliseconds, TimeUnit.MILLISECONDS)
                .pollingEvery(pollingIntervalInMilliseconds, TimeUnit.MILLISECONDS);
        wait.until(ExpectedConditions.elementToBeClickable(element));
        return this;
    }
   //other additional and overriding methods
   //.........................
   //.........................
到目前为止,机器人框架看起来很好,我也喜欢python ...但是我不知道我是否能够扩展像selenium2library这样的库来拥有我自己的自定义方法,就像我以前在java中所做的那样上面的例子。

2 个答案:

答案 0 :(得分:3)

你可以,但我不确定它对机器人框架有什么价值。有关如何子类化库和/或访问实际webdriver对象的示例,请参阅此问题的答案:Pass existing Webdriver object to custom Python library for Robot Framework

然而,使用机器人的全部意义在于您不直接调用webdriver函数。您当然可以覆盖这些方法(在python中称为“monkeypatching”),关键字将使用您的修补函数,但这不是必需的。使用robot时,不应直接与Web元素进行交互。

使用机器人框架,您应该编写更抽象的测试。例如:

*** Test Cases ***
| Login with valid credentials
| | Go to page | LoginPage
| | Enter the username | valid_user@example.com
| | Enter the password | letmein!
| | Click the login button
| | The current page should be | DashboardPage

注意测试根本不使用web元素。它使用高级关键字,无需直接与Web元素交互,添加等待等。测试编写器与页面的实际实现完全隔离,因此他们可以专注于测试本身的逻辑。

当然,机器人不提供这样的关键字,因为它是一个通用的框架。它提供了通用的关键字(“转到页面”,“点击按钮”等),但这并不是机器人框架真正的力量所在。真正的力量来自自定义页面特定的库。

在您的示例中,您展示了覆盖click方法,以便您可以添加显式等待。用机器人代替覆盖方法,你可以在任何有意义的地方建立等待关键词。

例如,“单击登录按钮”的实现可能如下所示:

def click_login_button(self):
    with self._wait_for_page_refresh():
        WebDriverWait(self.browser, 10).until(
            lambda *args: button_element.element_to_be_clickable((By.ID, locator.login_button))
        )
        self.browser.find_element_by_id(locator.login_button).click()

在这个例子中,我们已经注意等待元素可点击,我们点击它,然后我们等待页面在返回之前刷新。请注意,在关键字本身内,您可以随意使用python和selenium的全部功能,即使在测试用例级别中看不到任何一个。

注意:这些示例大致基于我编写的库,该库使用robot实现页面对象模式。有关该库的更多信息,请参阅此博客文章:Robot Framework Page objects

答案 1 :(得分:0)

可以在PythonJava中撰写扩展程序。但是,我认为使用已经available keywords并通过使用existig功能制作自定义关键字来创建测试逻辑是我们大多数人创建测试用例的方式。