我正在尝试检查某个元素是否不存在但是因超时问题而失败。根据我的观察,我发现驱动程序首先尝试找出该元素,然后等待元素消失,而不是检查元素是否存在或不存在。我试过以下方法。
1. browser.element.all(selector)
2. browser.driver.findElements(selector)
3. browser.isElementPresent(browser.element(selector))
4. element(selector).isPresent()
背景:点击按钮时,会出现一个模态。它有取消和保存按钮。单击取消按钮时,模态窗口消失。现在我正在尝试编写一个期望条件来检查模态是否已经消失。
以上都是失败的。请告诉我一个正确的方法,我可以检查一个元素是否立即存在。
以上是
的错误Error: function timed out after 60000 milliseconds
我真的不确定,为什么Protractor无法帮助我只检查DOM中是否存在该元素。我尝试了所有可能的方法。每个方法都试图查找现有元素是否正在转换为不存在的状态。那么为什么这么多API如果都做同样的工作呢。
答案 0 :(得分:3)
不确定为什么您为选择器使用browser.
,以及selector
实际上是什么,但我怀疑您遇到了多个问题。
首先,.isPresent()
确实要求在dom ; isDisplayed()
问是否可见。因此,您的策略将取决于您的模型是从dom中移除还是隐藏(例如。display:none
等...)。
其次,它并不表示您正在处理这些方法中的任何一种返回的承诺。如果您在expect
(自动等待承诺解决)中运行此操作,您也不会提及。
第三,不清楚你的模态选择器是返回单个元素还是多个元素(尽管你使用element.all
确实指出了后者。
长篇故事稍微长一点,这是一个如何检查你的模态是否显示的例子,假设你的模态有一个.myModal
的类,是唯一一个,它是未显示时从dom中删除。
$('.myModal').isPresent().then(function(inDom) {
return inDom; // returns bool
};
上面的代码抓住你的元素,检查它是否在dom中,通过.then
处理promise,如果元素在dom中则返回true / false。
那就是说,你的代码可能有多个模态,通过css隐藏。在这种情况下,您需要为该案例找到策略。也许你的代码为隐藏元素添加了一个.shown
类?很好,检查$('.myModal.shown')
的存在。也许你的代码在dom中有多个隐藏的模态...不太好,但你可以循环遍历每个元素,并测试任何是否与isDisplayed()
一起显示。
希望这有点帮助...
答案 1 :(得分:1)
我知道这篇文章很老了。但我找到了一种有用的方法:我创建了一个具有3个参数的函数
可用于测试DOM中存在(而不是)的每个元素
export async function checkField(field: any, fieldName: string, present?: any) {
let text: string;
if (present === false) {
if (field.length > 0) {
field.forEach(async el => {
try {
text = await el.getText();
expect('should not be present (' + fieldName + ')').toEqual('but it is');
} catch (e) {
expect(el.isPresent()).toBe(present);
}
});
} else {
try {
text = await field.getText();
expect('should not be present (' + fieldName + ')').toEqual('but it is');
} catch (e) {
expect(field.isPresent()).toBe(present);
}
}
} else {
if (field.length > 0) {
field.forEach(async el => {
try {
text = await el.getText();
expect(el.isPresent()).toBe(true);
} catch (e) {
expect('element present (' + fieldName + ')').toEqual('but i can\'t find it');
throw e;
}
});
} else {
try {
text = await field.getText();
expect(field.isPresent()).toBe(true);
} catch (e) {
expect('element present (' + fieldName + ')').toEqual('but i can\'t find it');
throw e;
}
}
}
}
显然,这可以用更好的方式编写,但是确实有效!
对于每个可以再次搜索此帖子的人。
答案 2 :(得分:0)
以下是来自量角器api docs的示例
expect(element(by.binding('notPresent')).isPresent()).toBe(false);
所以你的解决方案应该是,
expect(element(by.css('.elementClass')).isPresent()).toBe(false);
答案 3 :(得分:0)
我遇到了类似的问题,在尝试使用expect语句之前,使用expectedConditions等待模态消失可能会更好。
var WaitForElement = function(item, timeout = 15000) {
var el = element(by.css(item));
var EC = protractor.ExpectedConditions;
browser.wait(EC.not(EC.presenceOf(el)), timeout).then(function(){
return;
});
};
WaitForElement('.example').then(function() {
expect(element(by.css('.example')).isPresent()).toBe(false);
}
这将使量角器等待指定的元素(在这种情况下为' .example')在运行expect语句之前消失,否则它将在十五秒后超时并且期望将失败。 / p>
答案 4 :(得分:-1)
expect($(".example").isPresent()).toBe(false)
量角器中的每个方法都会返回一个promise。您必须使用帮助程序来解决它。如内置期望功能。