【问题标题】:UFT Actions IssueUFT 操作问题
【发布时间】:2023-04-29 14:43:01
【问题描述】:

我正在尝试参数化操作,下面是我设计的代码

Datatable.ImportSheet "Q:\Excel.xls","Sheet1","Action1"
a=datatable.GetSheet("Action1").GetRowCount
For i= 1 to a 
Datatable.GetShee("Action1").SetCurrentRow(i)
If datatable.Value("OracleDatabase","Action1")<>"" Then
    RunAction Datatable.Value("Scriptname","Action1"), oneIteration,"Oracle"
    msgbox  Datatable.Value("Scriptname","Action1")
End If 
If datatable.Value("SQLdatabase","Action1")<>"" Then 
    RunAction Datatable.Value("Scriptname","Action1"), oneIteration 
    msgbox Datatable.Value("Scriptname","Action1") 
End If 
RunAction "Action1 [MediumSanityWF12]", oneIteration 
Next

这里的问题是,当我运行上面的代码时,第一次迭代“Action1 [GUITest1]”正在执行并且它是正确的。 在第二次迭代中,对于 oracle 数据库,执行“Action1 [GUITest2]”脚本,对于 SQL 数据库,再次执行“Action1 [GUITest1]”。据我了解,它应该仅在我使用数据表的 setcurrentrow 方法时执行“Action1 [GUITest2]”操作。 我在这里有点困惑,为什么它在第二次迭代中为 SQL 数据库执行“Action1”而不是“Action2”?

请说明清楚。

【问题讨论】:

  • 分享你的数据表
  • @Saikrishna:我正在尝试粘贴整个数据表,但它只显示如下 Scriptname OracleDatabase SQLdatabase Access Action1 [GUITest1] Yes Yes Action1 [GUITest2] YEs Yes

标签: qtp hp-uft


【解决方案1】:

我希望这应该工作

Datatable.ImportSheet "Q:\Excel.xls","Sheet1","Action1"
a=datatable.GetSheet("Action1").GetRowCount
For i= 1 to a 
Datatable.GetSheet("Action1").SetCurrentRow(i)
If datatable.Value("OracleDatabase","Action1")<>"" Then
    RunAction Datatable.Value("Scriptname","Action1"), oneIteration,"Oracle"

End If 
Datatable.GetSheet("Action1").SetCurrentRow(i)
If datatable.Value("SQLdatabase","Action1")<>"" Then 
    RunAction Datatable.Value("Scriptname","Action1"), oneIteration 

End If 
RunAction "Action1 [MediumSanityWF12]", oneIteration 
Next

【讨论】:

  • 是的,这很棒。但是我的问题是,为什么当我只提到一次 Setcurrentrow 方法时它不起作用? .实际上,当我使用 setcurrentrow 方法时,它应该设置该特定行,并且它应该只接受该行中的值。但是这里发生的事情是,对于第一次迭代,它正在为 Oracle 和 SQL 以及第二次迭代,对于 Oracle 数据库,它正在执行“Action2”,而对于 SQL 数据库,它正在返回并执行“Action1”。这不是 setcurrentrow 方法的原始行为。我需要它这样做的原因。
  • 数据表是对整个测试的单个对象引用。如果您导航到下一个测试操作,getcurrent 行将获取该测试的值。因此您需要获取当前操作表并设置当前行值
  • 好的,但是如果我们在上面的代码中放置一些与文本框相关的代码而不是操作,setcurrentrow 工作正常,并且对于每个语句都不需要在可执行代码之前放置 setcurrentrow 语句。仅在参数化操作时才会发生这种情况。
  • SetCurrentRow 调用在动作返回时被“撤消”:从 QTP 11(我认为)开始,从动作返回会导致调用者的当前行被重置为迭代行。这就是为什么在 RunAction 调用后重新设置 Action1 的当前行会有所帮助。不幸的是,这是无证的。