Browser.wait() 直到 .getAttribute() returns 真
Browser.wait() until .getAttribute() returns true
我仍在学习量角器,所以我不确定这是否是一个我没有得到的简单答案,但我只是想让浏览器等待我检索的属性为真。
我正在测试 this site 的披萨选项。
完整代码:
browser.get('https://material.angularjs.org/latest/#/demo/material.components.select');
var topping = element(by.model('topping'));
topping.click();
browser.wait(function() {
return topping.getAttribute('aria-expanded').then(function(value) {
return value == 'true';
});
}, 5000);
var toppingOptions = element.all(by.css('[role="option"]'));
toppingOptions.get(5).click();
expect(topping.getText()).toBe('Onion');
这给了我错误:
Element is not clickable at point (436, 693). Other element would receive the click: <md-backdrop class="md-select-backdrop md-click-catcher md-default-theme"></md-backdrop>
请注意,如果我将 browser.sleep(1000);
放在 topping.click()
之后和 browser.wait()
之前,那么测试将通过。所以我知道测试的其余部分不是失败的原因。由于某种原因,等待呼叫不起作用。
我认为这可能与以下事实有关:我尝试单击的选项在单击 topping
时在技术上不可见,因为它位于带有滚动元素的 ComboBox 中。如果有人知道模拟滚动到 "onion" 元素的好方法,也将不胜感激。
我想你想要这样的东西:
var toppingElem = by.id('#topping'); // or how ever you can designate this element
browser.wait(function() {
return ptor.isElementPresent(toppingElem);
}, 5000);
您缺少等待条件函数中的 return
:
browser.wait(function() {
return topping.getAttribute('aria-expanded').then(function(value) {
return value == 'true';
});
}, 5000);
请注意,我还简化了 then
回调中的比较逻辑。
或者,您也可以等待选项元素变为可见:
var EC = protractor.ExpectedConditions;
var toppingOptions = element.all(by.repeater("topping in toppings"));
browser.wait(EC.visibilityOf(toppingOptions.first()), 5000);
toppingOptions.get(5).click();
我在我的一项测试中遇到了类似的问题,即 Selenium 在错误的坐标处单击。实际上,当元素从顶部移动到中心的速度不是很快时,Selenium 能够找到该元素(弹出窗口以这种方式加载)。然后在单击该元素时,它的位置发生了变化,并且单击了错误的位置,因此出现了错误。正如所讨论的那样,它似乎是硒的限制 here。
如果你有同样的问题,最好使用thread.sleep小间隔。
您可能还想访问以下页面:Debugging "Element is not clickable at point" error
我仍在学习量角器,所以我不确定这是否是一个我没有得到的简单答案,但我只是想让浏览器等待我检索的属性为真。
我正在测试 this site 的披萨选项。
完整代码:
browser.get('https://material.angularjs.org/latest/#/demo/material.components.select');
var topping = element(by.model('topping'));
topping.click();
browser.wait(function() {
return topping.getAttribute('aria-expanded').then(function(value) {
return value == 'true';
});
}, 5000);
var toppingOptions = element.all(by.css('[role="option"]'));
toppingOptions.get(5).click();
expect(topping.getText()).toBe('Onion');
这给了我错误:
Element is not clickable at point (436, 693). Other element would receive the click:
<md-backdrop class="md-select-backdrop md-click-catcher md-default-theme"></md-backdrop>
请注意,如果我将 browser.sleep(1000);
放在 topping.click()
之后和 browser.wait()
之前,那么测试将通过。所以我知道测试的其余部分不是失败的原因。由于某种原因,等待呼叫不起作用。
我认为这可能与以下事实有关:我尝试单击的选项在单击 topping
时在技术上不可见,因为它位于带有滚动元素的 ComboBox 中。如果有人知道模拟滚动到 "onion" 元素的好方法,也将不胜感激。
我想你想要这样的东西:
var toppingElem = by.id('#topping'); // or how ever you can designate this element
browser.wait(function() {
return ptor.isElementPresent(toppingElem);
}, 5000);
您缺少等待条件函数中的 return
:
browser.wait(function() {
return topping.getAttribute('aria-expanded').then(function(value) {
return value == 'true';
});
}, 5000);
请注意,我还简化了 then
回调中的比较逻辑。
或者,您也可以等待选项元素变为可见:
var EC = protractor.ExpectedConditions;
var toppingOptions = element.all(by.repeater("topping in toppings"));
browser.wait(EC.visibilityOf(toppingOptions.first()), 5000);
toppingOptions.get(5).click();
我在我的一项测试中遇到了类似的问题,即 Selenium 在错误的坐标处单击。实际上,当元素从顶部移动到中心的速度不是很快时,Selenium 能够找到该元素(弹出窗口以这种方式加载)。然后在单击该元素时,它的位置发生了变化,并且单击了错误的位置,因此出现了错误。正如所讨论的那样,它似乎是硒的限制 here。
如果你有同样的问题,最好使用thread.sleep小间隔。
您可能还想访问以下页面:Debugging "Element is not clickable at point" error