- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在遵循页面对象模型来自动化一个应用程序中的流程。在其中一个模块中,我必须断言页面标题和更多消息。截至目前,我将断言代码放入 PageFactory 本身中,如下所示:
public class EditPost {
WebDriver driver;
public EditPost(WebDriver editPostDriver)
{
this.driver=editPostDriver;
}
@FindBy(how=How.XPATH,using="//*[@id='message']/p")
WebElement post_published;
public void assert_message()
{
String actual_message_title=post_published.getText();
Assert.assertEquals(actual_message_title, "Post published. View post");
System.out.println("Message: Post published, Successfully Verified");
}
}
我从实现 TestNG 的主文件中调用断言方法,如下所示:
@Test (priority=5)
public void assert_message()
{
//Created Page Object using Page Factory
EditPost edit_post = PageFactory.initElements(driver, EditPost.class);
edit_post.assert_message();
}
目前,我正在通过 3 个包运行执行。浏览器工厂的“Helper”包、PageFactories 的“Pages”包和测试用例的“Testcase”包。
我的目标是向前迈进,我想重用为所有不同实用程序编写的代码。
我的问题是:
根据 PageFactory 和页面对象模型的概念,我的方法正确吗?或者我需要将断言移至“Helper”包中吗?或者我应该为断言创建一个单独的库/包? (在接下来的日子里,我可能需要在单个页面上执行多个断言)
在下一个冲刺中,我可能需要执行一些其他 Activity ,例如拍摄所有/失败的测试用例的屏幕截图。那么我如何保持设计的结构化和组织性,以便我可以重用代码/库/以最佳方式利用它们?
最佳答案
根据我见过的大多数网站,最佳实践是将断言保留在页面对象之外。下面是 Selenium 文档中的一个示例。
http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern
There is a lot of flexibility in how the page objects may be designed, but there are a few basic rules for getting the desired maintainability of your test code.
Page objects themselves should never make verifications or assertions. This is part of your test and should always be within the test’s code, never in an page object. The page object will contain the representation of the page, and the services the page provides via methods but no code related to what is being tested should be within the page object.
There is one, single, verification which can, and should, be within the page object and that is to verify that the page, and possibly critical elements on the page, were loaded correctly. This verification should be done while instantiating the page object. In the examples above, both the SignInPage and HomePage constructors check that the expected page is available and ready for requests from the test.
页面对象应返回产品名称、产品价格、当前选择的数量等信息。然后测试代码将断言返回的字符串与预期匹配。
assert_message()
将变为 getMessage()
并以 String
形式返回消息。见下文。
public String getMessage()
{
return driver.findElement(messageLocator).getText();
}
(注意:请继续阅读,了解我为何将 PageFactory
元素更改为此处的定位器。)
然后在您的测试代码中,您将拥有
Assert.assertEquals(editPost.getMessage(), "Post published. View post");
现在您已将断言代码保留在测试脚本中并保留在页面对象之外。
查看您的代码,我会提出一些进一步的建议。
我建议您阅读一些 Java 命名约定。有很多网站都有推荐,我认为它们之间有很多相似之处,但这里是 oracle recommendations首先。你的方法名称应该是
verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized.
因此 assert_message()
会变成 assertMessage()
等等。 _s 让它看起来更像 python。
定位器的优先顺序:ID、CSS 选择器,以及在极少数情况下的 XPath。 ID 应该始终是您的首选,因为它(根据 W3C 定义)在页面上应该是唯一的。 CSS 选择器应该是下一个,因为它是最快的(在我的测试中比 ID 更快),具有最好的浏览器支持,并且跨浏览器实现最一致。 XPath 应该只保留用于 CSS 选择器无法完成的事情,例如通过包含的文本查找元素。与 CSS 选择器相比,XPath 定位器的性能较差,并且没有与 CSS 选择器相同级别的支持。例如,您的 XPath 定位器可以轻松转换为 CSS 选择器“#message > p”。
这里有一些 CSS 选择器引用,可帮助您入门。
删除PageFactory
。是的,它似乎使事情变得更容易,但我认为在很多情况下它会导致更多问题,例如陈旧元素异常等。更喜欢根据需要抓取页面。在类的顶部声明所有定位器,并在需要时在方法中使用它们。
public class EditPost {
WebDriver driver;
By messageLocator = By.cssSelector("#message > p")
public EditPost(WebDriver editPostDriver)
{
this.driver = editPostDriver;
}
public String getMessage()
{
return driver.findElement(messageLocator).getText();
}
}
我知道这比您要求的要多,但希望它有帮助。
关于java - Selenium [Java] PageFactory 设计 : Where do I write my Assertions following Page Object Model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017058/
我正在执行 UPDATE .WRITE() 语句,并发现它显然只有在您像这样定义它时才有效: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE
我在 Unix 系统上用 C 编程。我知道: write(fd,"ABCD",4); 比这样做更好: write(fd, "A", 1); write(fd, "B", 1); write(fd, "
func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return h.Sum32() } 对于这
在经典的 asp 页面中,有人告诉我您可以使用 vbscript 或 jscript。而 jscript 就是 javascript。 所以我不确定 Response.Write、Response.W
当 openssl 子进程尝试 write() 到本地目录时,我收到此错误。在调用 write() 之前连接已关闭。它没有与 ssl 连接,因为我什至无法从 nodejs 文档启动示例代码。 我错过了
最近我在试验netty。我遇到了以下问题: ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但是 ctx.cha
请解释以下内容: def feed(data): import os print "DATA LEN: %s" % len(data) f = open("copy", "w") f.
有什么区别debug.write 和 Trace.write ?每个应该什么时候使用? 最佳答案 在典型的发布构建配置中,Debug class 被禁用并且什么都不做。 Trace但是,仍然可以在发行
我只是想知道,就性能而言,哪个更好(我在 FileStream 中使用 StreamWriter): 多次调用 Stream.Write(): StreamWriter sw = new Stream
我发现自己写给 stringwriter,然后在函数末尾执行 resp.Write(sw.ToString())。这是不必要的吗?如果我多次使用 HttpResponse.Write,即使我的页面是
我正在尝试通过 JavaScript 文件从 electron 打开一个新窗口,它可以工作,并打开了新窗口,但我无法将 HTML/文本写入新文件。我收到那个错误: Cannot read proper
我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 byt
我知道这听起来像是一个愚蠢的问题: write(*,*) 和 write(6,*) ?我在我研究所的 super 计算机上运行一个复杂的代码,它通过一个不同于 6 的单元号输出一个数据文件,显然编译的
我有一个结构体,它可以通过一系列复杂的方法调用转换为文本,其中包含大量 write!调用。此文本可以写入文件或调试日志。我正在决定是否使用 fmt::Write 或 io::Write .我不能真正使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
In the C standard library, an output can't be followed by an input and vice versa. 对于Linux API,可以在re
我希望能够为一件事做 document.write。然后延迟半秒,然后再记录。写一些。你知道这是否可能吗?而且,如果是这样,怎么办?到目前为止,我已经尝试过了,但没有奏效: document.writ
为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗? Write Function Alternat
我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str) 计算字
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!