我在 Katalon Studio 8.6.0 上,在 Windows 11 机器上。
出于某种原因,
WebUI.getText()
可能会返回 null/empty,即使页面上的 web 元素中存在一些 innerText
...
我有这个
BaseScrollableSelectionStrategy
那个doSelect(dropdownOption)
通过滚动到最后一个可用的下拉选项,然后到dropdownOption
本身,直到等待它完成。
这用于 CRM 自动完成,它会在滚动到当前页面后插入下拉选项(或任何其他小部件)的下一个“页面”。因此,一旦我们滚动到最后一个可用的下拉选项,它就会发生变化(因为应用程序会在那之后获取下拉选项的下一个“页面”)。
它的
doSelect
被定义为:
public void doSelect(TestObject dropdownOption) {
final long startTime = System.currentTimeMillis();
ActionHandler.HandleFailableAction({
this.waitForDropdownOption(dropdownOption);
}, { boolean success, _ ->
KeywordUtil.logInfo("${dropdownOption.getObjectId()} ${this.getActionStatus(success, startTime)}")
if (!success) {
final TestObject lastAvailableDropdownItem = new TestObject("Last available dropdown item")
.addProperty("xpath",
ConditionType.EQUALS,
"//lyte-drop-box[not(contains(concat(' ', @class, ' '), ' lyteDropdownHidden '))]//lyte-drop-item[last()]");
TimeLoggerUtil.LogAction({
if (!WebUI.waitForElementPresent(lastAvailableDropdownItem, 2))
return false;
GeneralWebUIUtils.ScrollDropdownOptionIntoView(lastAvailableDropdownItem);
return true;
}, lastAvailableDropdownItem.getObjectId(),
"scroll into view");
}
}, 15)
GeneralWebUIUtils.ScrollDropdownOptionIntoView(dropdownOption);
WebUI.click(dropdownOption);
}
当我们
GeneralWebUIUtils.ScrollDropdownOptionIntoView()
时,我们在做:
public static void ScrollDropdownOptionIntoView(TestObject to) {
WebUI.executeJavaScript("arguments[0].scrollIntoView({block: 'center'})", [WebUiCommonHelper.findWebElement(to, 3)]);
WebUI.waitForElementNotPresent(to, 1, FailureHandling.OPTIONAL);
WebUI.waitForElementVisible(to, 2);
}
当我运行一个充满测试用例的测试套件来处理这些类型的自动完成下拉选项(并使用这个
BaseScrollableSelectionStrategy
来处理它们)时,它用完了传递给ActionHandler.HandleFailableAction()
的整个15秒以上的时间!
onAction
(第一次)回调一直失败!它最终调用以下通用 WebUI util 方法:
public static boolean WaitForElementTextMatches(TestObject to, String expectedText, int timeOut, FailureHandling failureHandling = FailureHandling.STOP_ON_FAILURE) {
return this.WaitForElementCondition({ TestObject testObj ->
String testObjectText = WebUI.getText(testObj);
return testObjectText.equals(expectedText);
}, { boolean success, TestObject testObj ->
if (success)
return;
if (WebUI.waitForElementNotPresent(testObj, 1, FailureHandling.OPTIONAL)) {
WebUI.waitForElementPresent(testObj, timeOut);
}
if (WebUI.verifyElementPresent(testObj, 1, FailureHandling.OPTIONAL))
KeywordUtil.logInfo("TestObject '${testObj.getObjectId()}' is now present!")
if (WebUI.waitForElementVisible(testObj, timeOut, FailureHandling.OPTIONAL))
KeywordUtil.logInfo("TestObject '${testObj.getObjectId()}' has text '${WebUI.getText(testObj)}'")
},
to,
timeOut,
failureHandling);
}
雪上加霜的是,根据 Katalon/Selenium 的说法,该元素最终可能会出现,但永远不可见!
我明白了
TestObject 'Object Repository/Page_Create Member Lead - Zoho CRM/Member Lead Information Section/Member Category autocomplete/Membership dropdown option' is now present!
但从来没有
TestObject 'Object Repository/Page_Create Member Lead - Zoho CRM/Member Lead Information Section/Member Category autocomplete/Membership dropdown option' has text
...
滚动后,下拉列表 HTML 如下所示:
<lyte-drop-box
class="w100per createAutocomplete alyteautocompleteDropdown undefined lyteDropdownDown lyteDropboxRightAlignToButton"
style="position: absolute; width: 388px; min-width: 388px; top: 1703.34px; left: 251px;"
>
<span class="lyteArrow" style="width: 388px;"></span>
<div
class="w100per h5 m0"
mouseout="crm-create-fields => setFullViewRec(event,false)"
mouseenter="crm-create-fields => setFullViewRec"
></div>
<lyte-drop-body
role="listbox"
id="Lyte_Drop_Body_34"
lyte-rendered-ce=""
style="max-height: 250px; width: auto;"
class="lyteScrollBar"
>
<lyte-drop-item
data-zcqa="Member Category_4623170000074126386"
data-value="4623170000074126386"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_23"
lyte-rendered-ce=""
class=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Child Membership - Option B </span
><i
id="4623170000074126386"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000074124524"
data-value="4623170000074124524"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_24"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Child Membership - Option D </span
><i
id="4623170000074124524"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000074067550"
data-value="4623170000074067550"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_25"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Child Membership - Option A </span
><i
id="4623170000074067550"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000056764203"
data-value="4623170000056764203"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_26"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option F </span
><i
id="4623170000056764203"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000056748147"
data-value="4623170000056748147"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_27"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option G </span
><i
id="4623170000056748147"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000035961028"
data-value="4623170000035961028"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_28"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option E </span
><i
id="4623170000035961028"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000035914031"
data-value="4623170000035914031"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_29"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option C </span
><i
id="4623170000035914031"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000035905010"
data-value="4623170000035905010"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_30"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option D </span
><i
id="4623170000035905010"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000035889035"
data-value="4623170000035889035"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_31"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option B </span
><i
id="4623170000035889035"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000035827103"
data-value="4623170000035827103"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_32"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership - Option A </span
><i
id="4623170000035827103"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000026970010"
data-value="4623170000026970010"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_33"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Corporate Membership </span
><i
id="4623170000026970010"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000014601011"
data-value="4623170000014601011"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_35"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Child Membership </span
><i
id="4623170000014601011"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000014583083"
data-value="4623170000014583083"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_36"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Standard Membership </span
><i
id="4623170000014583083"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000014576015"
data-value="4623170000014576015"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_37"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Gold Membership </span
><i
id="4623170000014576015"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000014557044"
data-value="4623170000014557044"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_38"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Membership </span
><i
id="4623170000014557044"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<lyte-drop-item
data-zcqa="Member Category_4623170000014541068"
data-value="4623170000014541068"
aria-selected="false"
role="option"
id="Lyte_Drop_Item_39"
lyte-rendered-ce=""
>
<lyte-autocomplete-label aria-selected="false"
><span
class="lookup-autoc-text"
lt-prop-tooltip-class="lcreateTooltip"
lt-prop-tooltip-config='{"position" : "followcursor","margin" : "10","hidedelay" : "50"}'
mouseenter="crm-create-fields => setLookupTooltip"
>Silver Membership </span
><i
id="4623170000014541068"
class="info_icon infoIcoLookupAuto cP fR vh"
mouseout="crm-create-fields => infoPop(this,val,event)"
mouseenter="crm-create-fields => infoPop"
><crmutil-icon
icon-name="info-solid"
icon-class="zcicn-info-solid crmBaseIcon"
lyte-rendered=""
>
<svg class="zcicn_embedSvg zcicn-info-solid crmBaseIcon">
<use href="#zcicn-info-solid"></use>
</svg> </crmutil-icon
></i>
</lyte-autocomplete-label>
</lyte-drop-item>
<div class="lyteDropdownNoResult" style="display: none;">
No Results Found
</div></lyte-drop-body
>
<span
id="Crm_Potentials_POTENTIALCF04_load_img"
class="lookupTxtOverflow pL20 pR20 dN"
>
<img
class="mB6 dIB"
alt="loading"
src="//img.zohocdn.com/crm/images/loading_599c9b1_.gif"
/>
</span>
<div
class="w100per h5 m0"
mouseout="crm-create-fields => setFullViewRec(event,false)"
mouseenter="crm-create-fields => setFullViewRec"
></div>
<lyte-drop-footer>
<div
data-zcqa="AddNewRecord"
class="dropFooterList alignLeft pL25"
click="crm-create-fields => newAction()"
>
New Member Category
</div>
</lyte-drop-footer>
<div class="lyteautocompleteError noErrClass" style="display: none;"></div>
<div
class="lyteScrollContainer lyteScrollContainerY"
style="visibility: hidden;"
>
<div
class="lyteScrollDiv"
style="height: 161.392px; transform: translateY(93.6076px);"
></div>
</div>
<div
class="lyteScrollContainer lyteScrollContainerX"
style="visibility: hidden;"
>
<div class="lyteScrollDiv"></div></div
></lyte-drop-box>
在滚动之前,下拉列表最多包含企业会员资格下拉项。 滚动后,我们在视口中看到企业会员下拉项,并且整个列表可用。
我在 util 方法中修改了我的
onCheckCondition
(第一个)回调,如果 WebUI.getText(to)
是 null
或 ''
,则通过 JavaScript 获取文本。这是该方法现在的样子:
public static boolean WaitForElementTextMatches(TestObject to, String expectedText, int timeOut, FailureHandling failureHandling = FailureHandling.STOP_ON_FAILURE) {
return this.WaitForElementCondition({ TestObject testObj ->
String testObjectText = WebUI.getText(testObj);
if (SMDStringUtils.IsNullOrEmpty(testObjectText))
testObjectText = (String)WebUI.executeJavaScript('return arguments[0].innerText', [WebUiCommonHelper.findWebElement(testObj, 1)]);
return testObjectText.equals(expectedText);
}, { boolean success, TestObject testObj ->
if (success)
return;
if (WebUI.waitForElementNotPresent(testObj, 1, FailureHandling.OPTIONAL)) {
WebUI.waitForElementPresent(testObj, timeOut);
}
if (WebUI.waitForElementVisible(testObj, timeOut, FailureHandling.OPTIONAL))
KeywordUtil.logInfo("TestObject '${testObj.getObjectId()}' has text '${WebUI.getText(testObj)}'")
},
to,
timeOut,
failureHandling);
}
我运行它,挂起的问题消失了!我什至不需要改变任何其他东西!!
问题是
WebUI.getText(testObject)
,以及幕后发生的element.getText()
,可能返回一些空字符串,尽管HTML元素可能在DOM中,已经被测试代码等待,它有一些innerText
,测试可能已经找到了
是什么导致了这种情况发生?!