我知道这可能是一个非常基本的问题,但我最近开始使用QTP,我仍然在做一些事情。在过去的几个小时里,我一直在寻找答案但到目前为止没有运气。
我的问题:
在QTP代码中,我们通常写:
Browser("x").Page("y").Navigate("url")
我想了解这个Browser对象的来源以及x和y究竟是什么。
1)它是VBScript的一部分还是QTP的一部分?
2)另外,我在哪里可以获得有关此对象结构的完整详细信息?我想知道除了“页面”和“导航”之外我还能写什么。
答案 0 :(得分:5)
Browser
测试对象表示选项卡式浏览器中的单个选项卡。
调用Browser
函数时,QTP返回一个测试对象,通常这是来自关联对象存储库的具有该名称的浏览器(与您的"x"
示例一样)但它可能使用{{3}创建一个新的测试对象。
调用Browser
的子元素时,您有两个选项(与所有测试对象一样)
Browser
的孩子几乎总是Page
但Window
或其他对象可以出现(取决于您正在测试的应用程序)。 Page
测试对象代表Browser
中显示的顶级HTML文档。
BTW,你写的代码片段是错误的。 Page
不支持Navigate
方法Browser
。
答案 1 :(得分:2)
在您的示例中,“x”和“y”指的是对象存储库中的逻辑名称。所以回答问题#1,这是QTP的一部分,而不是VBScript。对象存储库是一种中间人,它在VBScript代码中映射逻辑名称,以及在运行时识别对象的实际细节。这只是一种抽象。
总的来说,我建议对该工具进行一些正式培训。培训将回答您关于此类事情的大部分问题。网上也有很多教程。最后,帮助指南将引导您完成许多基础知识。
答案 2 :(得分:1)
实际上,Browser对象表示当前打开的所有浏览器窗口和选项卡的集合。您可以按名称或描述指定特定的一个,如下所示:
Browser("website")
其中"网站"是一个命名的"浏览器对象"在对象存储库中,或者是描述您要使用的特定窗口/选项卡的描述(字符串或对象)。
Page对象表示上面提到的浏览器可能已加载的所有可能页面的集合。集合中的实例对应于命名的" Page对象"在对象存储库中。您可以按名称或描述指定特定的一个,如下所示:
Browser("website").Page("Logon Page")
这个概念可能非常混乱,特别是考虑到任何给定的实际浏览器窗口/选项卡在任何给定时刻只能加载一个实际页面的事实。换句话说,如果你遍历浏览器的实时子对象("网站"),总会只有一个。
考虑这种浏览器/页面关系的最佳方式是使用正确的比喻。当我第一次开始使用QTP进行编程时,我认为最好将浏览器对象视为IE,Chrome,Firefox等,并且我试图以这种方式管理我的对象存储库对象,并且它造成了巨大的混乱。
我现在明白,在Object存储库中组织浏览器对象的最佳方法是这样的:
将存储库中的浏览器对象视为单个网站对象。 Amazon.Com MSN.Com StackOverflow.Com LifeHacker.Com等等。
将存储库中的页面对象视为网站对象的唯一明确唯一页面。对于网站可能显示的每个不同页面(使用不同的控件),您应该在浏览器对象下创建一个单独的Page对象。您的存储库可能如下所示:
Amazon.com
Login Page
Music Page
Books Page
Checkout Page
StackOverFlow.Com
Login Page
username field
password field
Questions Page
Jobs Page
Tags Page
Users Page
Badges page
etc etc...
这里的想法是创建逻辑页面以包含仅在那些页面上出现的控制对象。
现在对于棘手的事情......
为了使这项工作,我们必须确保浏览器和页面对象实际上存在"什么时候应该对于浏览器对象,它应该"存在"无论何时在任何浏览器选项卡中加载任何页面。对于页面对象,它应该"存在"只有当该网站的该页面被加载时,它才会在屏幕上显示特定的控件。
这意味着我们需要仔细编辑浏览器对象的标识属性,这样无论当前加载哪个网站页面,它都会将网站正确地标识为该浏览器对象。
以下是一个例子......在我的工作中,我有一个名为" Trade"的网站。通过"name:=Trade"
可以找到浏览器,但登录页面略有不同 - 它的名称是"欢迎使用贸易" ...以便建立网站对象工作,我在标识属性中使用正则表达式,如下所示:"name:=(?:Welcome to Trade|Trade)"
。这样,相同的浏览器对象就表示存在"存在"当找到任何一个名字时。通过这种方式,我可以将登录页面作为整个网站对象的一部分包含在内,而不必使用仅包含登录页面的浏览器对象来混淆对象存储库。这使得以后读取代码更加烦人,并且使用WITH块的复杂化
另一个问题是Page对象通常很难区分。它们加载的URL可以是动态的,页面标题可能根本不会从一个页面更改为另一个页面。为了解决这个问题,我在对象存储库中为我的页面对象添加了额外的标识属性...例如,我可以手动添加URL属性,然后使用正则表达式来监视URL中的特定标记,如下所示:{{ 1}}这将是强制title属性的补充(永远不会删除强制属性,否则录制引擎将无法正确记录)
所以,更直接地回答这个问题......
我希望这会有所帮助。一旦我将对浏览器/页面的理解转换为我在此处描述的比喻,它就大大提高了我使用QTP的能力。