代码之家  ›  专栏  ›  技术社区  ›  Allyl Isocyanate

如何运行webdriver。io同步?

  •  0
  • Allyl Isocyanate  · 技术社区  · 6 年前

    webdriver.io's what's new in v4.0 docs说“这都是同步的……所有命令现在都会阻止测试过程的执行,直到它们解决为止。”

    我能找到的同步WebDriver代码的唯一示例是:

    browser.url('/');
    var title = browser.getTitle();
    

    当我执行类似的操作时(通过 note test.js wdio ):

    var webdriverio = require('webdriverio');
    var options = {
      desiredCapabilities: {
        browserName: 'chrome',
        logLevel: 'silent'
      }
    };
    
    const driver = webdriverio.remote(options)
    driver.url('http://www.google.com')
    const title = driver.getTitle()
    console.log('title', title)
    

    ...标题为 title { state: 'pending' } ,表示这是一个承诺。我如何说服它以同步方式运行,理想情况下不必使用异步/等待?

    1 回复  |  直到 6 年前
        1
  •  1
  •   LILBRICK1337    6 年前

    启动浏览器后

    const client = webdriverio.remote(options).init()
    

    webdriver有一个众所周知的问题。io和chrome浏览器不属于此awnser的一部分,但其结果也将解释您的问题。Chrome在低硬件pc上冻结,如果你运行webdriver。io命令,直到chrome完全加载您的脚本崩溃。解决方法是将此作为示例:

     client
     .url('http://localhost/dashboard')
     .waitForVisible('body', 20000000).then(function(isExisitingLOCALHOST){
        //.. you may add here aswell a timeout if your hardware is really low and has really long freezing.
    
                  client
                  .url('http://yourwebsite.com') // <-- webdriver.io will wait until your loading icon from the tab is ready. This means at ajax websites you must build aswell a workaround with the waitForVisible() endpoint. As example waiting for a specific item to load logo, text etc.
                  .click('#sample')
    
      })
    

    有了这个小的解决方法,您可以确保在启动过程中避免浏览器冻结,并等待它完成。这也解释了webdriver的同步写入方式。io

    您可以以无休止的同步方式创建您的webdriver。io API端点:

    client
    .click()
    .pause(1000)
    .rightClick()
    

    了解pause()在某些点上确实有问题,而且它不会同步,有时它不工作,这一点也很重要。。您应该使用javascript中的基本setTimeout。

    你也可以这样写

    client.getText('#sample1');
    client.getText('#sample2');
    

    处理彼此相邻的多个api端点。