0

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

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

我的要求是测试 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
   //.........................
   //.........................

到目前为止,Robot Framework 看起来不错,我也喜欢 python.. 但是我不知道我是否能够扩展 selenium2library 之类的库以拥有自己的自定义方法,就像我在上面的示例中在 java 中所做的那样。

4

2 回答 2

3

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

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

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

*** 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 元素交互、添加等待等的需要。测试编写者与页面的实际实现完全隔离,因此他们可以专注于测试本身的逻辑。

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

在您的示例中,您展示了覆盖该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 的全部功能,即使在测试用例级别都看不到这些功能。


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

于 2016-12-01T23:17:00.770 回答
0

可以使用PythonJava编写扩展。但是,我认为使用现有的关键字并通过使用现有功能制作自定义关键字来创建测试逻辑是我们大多数人创建测试用例的方式。

于 2016-12-01T21:25:59.587 回答