- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
ArrayList corousalItems= new ArrayList<>(); List listText= driver.findElements(By.cssSelector("Cor
我正在学习 Selenium,我有一个问题,假设我们有以下内容: 我可以使用带有 的 Css 选择器来选择包装元素列表.wrapper .所以,假设我有这些元素,我该如何选
我正在使用 Selenium WebDriver 和 Java。我正在尝试创建一个循环访问 WebElements 列表的方法,以返回包含文本“Ooga Booga”的第一个 WebElement,或
我正在尝试使用 Selenium 获取另一个提取元素内的元素。但我得到了意想不到的结果。例如,下面的代码在循环中返回相同的“数据时间”和推文时间。请注意“data-item-id”如何不同,但“dat
对源代码进行了简短的扫描,不确定最佳做法是什么。 例如,假设我有一个页面对象“DummyPage”,它有两个面板元素TopPanel 和BottomPanel。每个面板都有一些元素,这些元素由 Top
List fields = (List) driver.findElement(By.xpath("//input[@type='text']")); System.out.println(field
我想在 List 中找到 WebElement通过文本。我的方法有这样的参数:List webElements, String text .对于匹配文本,我更喜欢使用 javaslang图书馆。所以,
如何比较两个 selenium WebElements 看它们是否相同? 首先,我检索了 input_fields 和 first_input 元素的列表: self.input_fields = d
我正在使用 Appium,我想打印列表中元素的名称。我正在使用以下代码 List list = getDriver().findElementsByXPath(getLocator(Locators.
任何人都可以帮助我了解如何使用这两个函数来获取任何 CSS 属性的值。 最佳答案 如果有特定的标签如下 driver.getElement(By.tagName("img")).getAttribu
我正在从 facebook 获取日期网络元素,并使用下面的代码循环它。 public class select_facebook { public static void main(Strin
所以我尝试使用 XPath 从一个 webelement 到另一个 webelement。这就是 webelement 所在的路径,我通过使用“findElementsByClassName”找到它。
我想在 YouTube 评论页面上按此顺序单击这三个不同的网络元素 showmorebutton、viewrepliesbutton、readmorebutton(例如 https://www.you
如何在webelement列表中存储webelement?我已经为 webelement 创建列表并在 add 方法中传递 webelement obj,但系统显示空异常。Java代码:List el
我已经弄清楚如何使用这篇 Stack overflow 帖子在 python 中使用 Selenium 查找元素的子元素。 Selenium Get WebElement inside a WebEl
我创建了这个测试脚本来测试网站。问题是,有时我可以单击编辑按钮,但有时我会收到同一按钮的 NoElementFoundException 异常。我在论坛上搜索了相同类型的问题,并按照建议更改了代码,但
我有个问题。 是什么让 FirefoxDriver 能够找到 WebElements 并在 java 代码中单击它们,但是当使用 HtmlUnitDriver 运行相同的代码时,找不到相同的 WebE
我编写了一个java类(CustomerHistoryMapping),其中包含一个HashMap(String,WebElement),如下面的代码(代码的第一部分)我的总体目标是能够使用给定的 W
我对 Selenium 测试还很陌生,所以如果我的问题听起来很简单,我提前道歉。 我正在使用 Java 和 Selenium 编写测试。有时我需要单击 WebElement(例如按钮)。如果我使用 e
Page page = new Page(); page.populateProductList( driver.findElement( By.xpath("//div[@id='my_25_pro
我是一名优秀的程序员,十分优秀!