Python 量角器中的期望条件

Python 量角器中的期望条件,python,testing,selenium,selenium-webdriver,protractor,Python,Testing,Selenium,Selenium Webdriver,Protractor,在用Python编写selenium测试时,我习惯于使用很多方法来等待页面加载、等待元素变为可见或可单击等: from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(drive

在用Python编写selenium测试时,我习惯于使用很多方法来等待页面加载、等待元素变为可见或可单击等:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
这里的关键概念是提供预期的等待条件,有多种类型:

与使用硬编码时间间隔的
sleep
s相比,使用预期条件可以使代码更干净、更可靠

现在,我们正在大量地将端到端测试基础架构切换到
量角器

量角器中是否存在与或中类似的
预期条件
? 如果不是,在
量角器中显式等待条件的规范方法是什么

我看了一遍,什么也没发现。

在量角器中,你们可以使用

例如:

var element = by.id('myDynamicElement');
browser.wait(function() {
  return ptor.isElementPresent(element);
}, 10000);

expect(ptor.isElementPresent(element)).toBeTruthy();
一旦进入(可能是量角器1.7),您可以执行以下操作:

var EC = protractor.ExpectedConditions;
var e = element(by.id('xyz'));
browser.wait(EC.presenceOf(e), 10000);
expect(e.isPresent()).toBeTruthy();
不过请注意,如果您使用的是Angular应用程序,并且您的测试需要这些条件等待,那么对于您正在做的事情来说,这是一个很大的危险信号,因为量角器应该以本机方式处理等待

waitForControlVisible(locator: string, timeout: number) {
    try {
        const element = this.findElement(locator);
        const condition = browser.ExpectedConditions;
        browser.wait(condition.visibilityOf(element), timeout);
    } catch (e) {
        console.log(e.message);
        console.error('Control not visible.', e);
    }
}

也许可以帮助您,等待DOM中的元素可见性。

是的,我想就是这样,尽管我确实错过了所有预期的条件——其他selenium语言绑定提供的快捷方式。非常感谢。仅供参考,我已在Gragrator的问题跟踪器上创建了一个github问题:。当前版本(目前为2.0.0)支持:browser.wait(fn,timeout,errorMessage)。有助于添加特定的错误消息。这是您想要的吗@汉端,除非建造不会失败:)开玩笑,没错,超级棒!如果你有时间-请在这里发布关于该功能的答案,如果没有-我可以在istead,lmk上完成。非常感谢。关于您最后对红旗的评论,您如何等待当前在量角器1.5中某个元素不可点击(=禁用或不可见)?谢谢。理想情况下,当您的页面稳定(即waitForAngular Finishing作为量角器的一部分)时,页面中的任何内容都不应更改。(即,您的元素可点击或不可点击,等待不会导致其状态改变)。我知道有些情况下这是不正确的,比如某些动画和涉及setTimeout(尽管理想情况下,您希望用interval service替换setTimeout)。因此,是的,有些情况下,即使是角度应用程序,您也必须添加等待,但大多数情况下,这是测试中的一个错误。@hankduan:似乎在没有这些预期条件的情况下,我们的测试经常失败(纯角度应用程序)。有时甚至连我都不知道。我想知道是否还有其他人遇到这种不一致的情况。@VSO我发现有时动画会导致这种情况-量角器可能认为根据EC可以单击某个元素,但不知何故,正在进行的动画/css转换阻止了这种情况。我最近在这里发布了一个可能的解决方案:根据我的经验,需要一个
浏览器。wait(//dragrator.ExpectedConditions)
,就像加载一个完整的页面一样。也许它也是(仅?)必需的。