在不通过量角器测试的情况下捕获错误(等待元素可见)

时间:2018-07-26 14:24:41

标签: javascript typescript selenium protractor try-catch

我的应用程序具有“条款和条件”模式,该模式仅在某些情况下出现。我希望量角器测试在出现模态时单击“同意”,而在未出现模态时不执行任何操作。

这是我的方法,我尝试等待元素出现,如果没有出现,则捕获错误。如果出现按钮,则单击它,测试通过。但是,如果未出现该按钮,则测试将失败,并显示“元素花的时间太长...”消息。

  waitForAgree() {
    var until = protractor.ExpectedConditions;
    try {
      browser.wait(until.visibilityOf(this.agreeTerms), 5000, 'Element taking too long to appear in the DOM');
      this.agreeTerms.click();
      this.continue.click();
    } catch (e) {
      console.log("not found");
    }
  }

我也尝试了以下方法。这给我消息Failed: Cannot read property 'agreeTerms' of undefined

  clickAgree() {
    //browser.ignoreSynchronization = true;
    this.agreeTerms.isPresent().then(function (isPresent) {
      if (isPresent) {
        this.agreeTerms.click();
        this.continue.click();
      }
      else {
        console.log("not found");
      }
    })
  }

感谢您对这些错误的任何帮助。

3 个答案:

答案 0 :(得分:0)

如果size of list等于 1 ,我会将该网络元素存储在列表中(在这种情况下,知道按钮存在,因此单击它)。如果该列表返回零,则打印失败消息。

我将使用 findElements 而不是 findElement

这是定义列表的方式:

var elems = driver.findElements(By.xpath("your locator")); 

要计算尺寸,您可以使用以下方法:

var keys = Object.keys(elems);
var len = keys.length  

之后:

if (len == 1){
    this.agreeTerms.click();
    this.continue.click();
}
else{
  Do something here, button did not appear.
}

答案 1 :(得分:0)

我尝试了第一个方法的替代方法,并且该方法有效。我不完全确定为什么我的问题中的第一个失败了,并且成功了。如果有人想详细说明,请提前谢谢。如果您只需要一种可行的方法,请在这里:

kind: Endpoints
apiVersion: v1
metadata:
  name: externalDB
  namespace: default
 subsets:
  - addresses:
      - ip: 10.128.0.2 
    ports:
      - port: 7199 
        name: interface

答案 2 :(得分:0)

为了详细说明为什么第一种方法行不通,我们应该注意,使用Promise而不调用.catch通常是一个坏主意,因为大多数时候我们永远都不知道是错误的,try/catch根本无济于事。这也是您的备用方法成功的原因,因为您正在.catch上调用Promise

如果您有兴趣使第一种方法可行,那么您应该使用async/await,如下所示:

async waitForAgree() {
    var until = protractor.ExpectedConditions;
    try {
      await browser.wait(until.visibilityOf(this.agreeTerms), 5000, '...too long...');
      this.agreeTerms.click();
      this.continue.click();
    } catch (e) {
      console.log("not found");
    }
}

请注意,在函数名称前应加上关键字async,在对await的调用前应注意browser.wait。请注意,这是ES6功能。

希望有帮助