gpt4 book ai didi

java - 在 RobotFramework 中扩展 selenium2library WebElement

转载 作者:行者123 更新时间:2023-12-01 21:12:06 24 4
gpt4 key购买 nike

我是 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
//.........................
//.........................

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

最佳答案

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

但是,使用 robots 的重点是您不直接调用 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 的全部功能,即使这些在测试用例级别上都不可见。

<小时/>

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

关于java - 在 RobotFramework 中扩展 selenium2library WebElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com