我在为Cucumber驱动程序创建浏览器实例时遇到问题.如果我在"之前做"的env.rb中创建对象:
Before do
@browser = Watir::Browser.new 'firefox'
end
Run Code Online (Sandbox Code Playgroud)
...工作正常,为每个功能打开一个新的浏览器,并在"After do"上关闭它.
这会降低执行速度,因为新浏览器会启动并关闭每个功能.但是如果我在"之前做"中创建@browser以便为所有功能使用相同的浏览器会话,则会出现以下错误:
**Unable to pick a platform for the provided browser (RuntimeError)**
Run Code Online (Sandbox Code Playgroud)
......根本没有进行任何测试.我正在使用页面对象gem,ruby-on-rails ......
你能告诉我,我做错了什么?非常感谢!
ruby-on-rails cucumber watir-webdriver pageobjects page-object-gem
想象一下,我有一个div(用Watir语言):
@browser.div(:id, 'home_slideshow')
Run Code Online (Sandbox Code Playgroud)
我需要里面的html代码来做一些"魔法正则表达式":).获取div html代码的方法可能是:
the_div_html = @browser.div(:id, 'home_slideshow').html
Run Code Online (Sandbox Code Playgroud)
好.我正在使用page_object gem并假设我将div作为元素,例如:
div(:slide_show, :id => 'home_slideshow')
Run Code Online (Sandbox Code Playgroud)
要获得html里面我可以使用:
the_div_html = slide_show_element.html
Run Code Online (Sandbox Code Playgroud)
......但是我得到了弃权警告:
*** DEPRECATION WARNING
*** You are calling a method named attribute_value at home_page.rb:80:in `get_slide_code'.
*** This method does not exist in page-object so it is being passed to the driver.
*** This feature will be removed in the near future.
Run Code Online (Sandbox Code Playgroud)
如何使用page_object元素获取html代码?正如我之前提出的一些类似的问题,确定答案是如此简单,但我看看Cheezy书,整个stackoverflow和页面对象rubydoc信息,我没有找到它.你能告诉我路吗?
先感谢您!
我正在尝试使用OpenQA.Selenium.Support.PageObjects中包含的[FindsBy]属性将多个IWebElement设置为一个集合,如下所示。假设我想将所有“ li”元素保留在实例变量“ MyElements”中。
的HTML
<ul class="elements">
<li>e1</li>
<li>e2</li>
<li>e3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
C#
class TopPage {
[FindsBy(How = How.CssSelector, Using = "ul.elements li")]
public IWebElement[] MyElements;
}
Run Code Online (Sandbox Code Playgroud)
我该如何进行这项工作?
我知道有Selenium IDE和Selenium Builder作为Firefox插件来记录动作并将它们导出为例如C#-Code.
但是还有一个工具可以帮助您按照PageObject模式创建Selenium(2)WebDriver测试代码吗?我知道这很难,因为程序必须知道如何实现抽象.
据我所知,这样的工具不存在?但是,由工具支持创建Selenium WebDriver PageObject-Code的最佳方法是什么?
也许使用Selenium构建器只是通过id,类名等创建引用并在我的代码中手动实现它们?这可能比我自己决定精确识别元素的速度要快一些.但是为什么Selenium Builder的开发人员动态地创建元素引用
IWebDriver wd = new RemoteWebDriver(DesiredCapabilities.Firefox());
wd.FindElement(By.Id("NameField")).Click();
wd.FindElement(By.Id("NameField")).Clear();
Run Code Online (Sandbox Code Playgroud)
而不是FindBy属性?
[FindsBy(Using = "NameField")]
public IWebElement nameField;
Run Code Online (Sandbox Code Playgroud)
元素将是可重用的,代码将更短.
我有以下java类(实现页面对象模式)
package core.pageObjects;
import org.openqa.selenium.*;
public class ConsultaClientePorDocumento {
private WebDriver driver;
public ConsultaClientePorDocumento(WebDriver d){
this.driver = d;
}
public WebElement cancelarButton = driver.findElement(By.id("Cancelar"));
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试在我的测试中使用它,如下所示:
import core.pageObjects.*;
ConsultaClientePorDocumento consultaCPD = new ConsultaClientePorDocumento(driver);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java.lang.NullPointerException
at core.pageObjects.ConsultaClientePorDocumento.<init>(ConsultaClientePorDocumento.java:16)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在关注Selenium自动化的页面对象设计模式,我可以猜测很多人将定位器存储在.properties
文件中并通过代码访问它们.将定位器放在不同的位置似乎很棒.
既然,我还没有参与任何关于Selenium自动化的大项目,我想知道关于跟随的想法,以便我可以避免将来可能出现的问题:
在大型项目中存储属性文件中的定位器是否有用(测试用例超过1000个左右)?
a)如果对大型项目没有帮助,那么使我们不在属性文件中存储定位器的困难是什么?
b)如果它有用,如果采取了哪些预防措施可以使工作更轻松?
我似乎陷入了页面对象的构造.我阅读了很多关于页面对象的文档,并且知道它们包含两件事:
当我检查示例文件时,我看到元素是在每个页面对象的开头定义的.在测试中,pageobject通过require导入.但我看到的问题是,当需求发生时,对象尚未存在.有没有其他方法来解决这个问题,而不必在页面加载时执行需求?
提前致谢.问候
我知道我可以用 (driver.findElements(By.xpath("Xpath Value")).size() != 0);
但是,我使用的是页面对象模型,其全部目的是在单独的类中预定义WebElement,因此不必在测试类中使用“ FindElements By”。
这是我目前拥有的
if (objPage.webElement.isEnabled()){
System.out.println("found element");
}else{
System.out.println("element not found");
}
Run Code Online (Sandbox Code Playgroud)
但是,这试图识别可能不存在的WebElement。当它不存在时,我得到:
没有此类元素”例外。
我正在使用site_prism来实现水豚中的页面对象模型。看起来很有趣。
我如何指定一个选择器,例如“[data-id='x']”,其中x是整数?像这样的东西:
class Home < SitePrism::Page
set_url "http://www.example.com"
element :row, "[data-id='@id']"
end
Run Code Online (Sandbox Code Playgroud)
然后在我的测试中:
Then /^the home page should contain a row$/ do
@home.should have_row 1234
end
Run Code Online (Sandbox Code Playgroud) 我有一个方法可以获取元素的 href 属性hrefAppTheme
并检查它是否是 string-array 的值之一appThemes
:
describe('...',() => {
it('should ...', () => {
(...)
let defaultAppTheme = '';
onMenuPage.hrefAppTheme.invoke('attr', 'href')
.then(hrefVal => {
if (typeof hrefVal !== 'undefined') {
expect(hrefVal).to.be.oneOf(onMenuPage.appThemes);
defaultAppTheme = hrefVal;
//referencing the variable 'defaultAppTheme' further below...
}
});
Run Code Online (Sandbox Code Playgroud)
可以安全地假设this.hrefAppTheme.invoke('attr', 'href')
总是返回用户主题之一(字符串),因为上面的代码工作可靠。
由于事实证明我需要在几个不同的地方使用该逻辑,因此我想将其提取到一个方法中并将其放入页面对象类中。这就是我所拥有的:
export default class MenuPage {
(...)
getUserTheme(): string {
let userTheme = '';
cy.then(() => {
this.hrefAppTheme.invoke('attr', 'href')
.then(resVal => {
if (typeof resVal !== 'undefined') {
userTheme = resVal; …
Run Code Online (Sandbox Code Playgroud) pageobjects ×10
selenium ×4
java ×3
c# ×2
cucumber ×2
ruby ×2
capybara ×1
cypress ×1
invoke ×1
javascript ×1
node.js ×1
protractor ×1
selenium-ide ×1
site-prism ×1
typescript ×1
webdriver ×1