问题描述
为了单击按钮,我必须等待元素滑入可见视口。这可靠地起作用:
await browser.sleep( 1200 );
await btnToggleDeactivateQuestionnaire.click();
但是,由于我已经知道使用“ browser.sleep()”被认为是不好的做法,所以我想使用量角器的 ExpectedConditions :
let isPresent = EC.presenceOf(btnToggleDeactivateQuestionnaire);
let isVisible = EC.visibilityOf(btnToggleDeactivateQuestionnaire);
let isClickable = EC.elementToBeClickable(btnToggleDeactivateQuestionnaire);
let isPresentAndVisibleAndClickable = EC.and(isPresent,isVisible,isClickable);
await browser.wait(isPresentAndVisibleAndClickable,4000);
await btnToggleDeactivateQuestionnaire.click();
等待4秒钟后,出现以下错误:
Failed: Wait timed out after 4019ms
TimeoutError: Wait timed out after 4019ms
at C:\xxx\lib\promise.js:2201:17
at runMicrotasks (<anonymous>)
at processticksAndRejections (internal/process/task_queues.js:97:5)
经过反复试验,我发现仅使用 “ EC.presenceOf”可以解决问题。但是,一旦我将其与“ EC.visibilityOf”或“ EC.elementToBeClickable”链接在一起,或者单独使用它,测试就会停止4秒钟,并在此时失败。
在我看来,这种行为似乎毫无意义。尤其是由于该元素自页面加载以来就存在,因此它尚不可见并单击(因为它必须先滑入视图)。
我对ExpectedConditions或它们在非角度站点上的行为的一般理解是错误的吗?我在这里想念什么?
解决方法
我的猜测是,这在量角器的功能范围内无法正常工作?:
EC.and(isPresent,isVisible,isClickable);
我会尝试这样的事情:
let isPresent = await EC.presenceOf(btnToggleDeactivateQuestionnaire);
let isClickable = await EC.elementToBeClickable(btnToggleDeactivateQuestionnaire);
await btnToggleDeactivateQuestionnaire.click();
由于我认为您不需要visibilityOf
后接elementToBeClickable
,因此等待其可点击性应该可以正常工作。
我了解到,Web应用程序并非总是完美地制作而成,因此,当您使测试自动化时,找到正确的元素等待进行,是最具挑战性的部分。