selenium_量角器教程:使用Selenium处理超时

selenium_量角器教程:使用Selenium处理超时_第1张图片

selenium

很多时候,在执行Selenium测试自动化时,由于网页或Web元素需要花费一些时间才能完全加载而导致测试失败,您会遇到某些情况。 在这种情况下,最好的方法是等待页面或Web元素完全加载,以避免由于超时而导致任何错误。 如果您知道如何使用Selenium处理量角器中的超时,则可以轻松解决这些错误,因为它们有助于设置执行下一个操作之前的时间间隔。

为了使其更简单,假设您访问了亚马逊的网站,找到一个特殊的交易按钮,然后单击它,它会弹出一个带有报价的弹出窗口,进一步将您带到交易页面。 这些不同的元素(如按钮和弹出窗口)需要花费一些时间才能加载并变得互动。 但是,当我们在没有任何指令等待的情况下运行测试脚本时,最终会引发错误。 为了解决这个问题,我们需要使用Selenium处理量角器中的超时,以便为特定元素加载留出足够的时间。

因此,为了帮助您解决此问题,在本量角器教程中,我将向您展示如何处理超时。 如果您不熟悉量角器,则可以访问此量角器教程,该教程针对第一个用于量角器测试的测试脚本进行运行。

等待页面加载时超时

在执行Selenium测试自动化以浏览浏览器上的页面时,您将指示Selenium WebDriver使用browser.get()命令加载网页。 在后台,量角器框架等待页面完全加载。

因此,让我们以一个测试用例来处理Selenium Protractor中的超时,在该示例中,我们将超时设置为5000毫秒或5秒,浏览器将等待页面加载直到5秒钟,如果页面需要更多时间加载,则会返回错误。

为此,您必须将getPageTimeout(超时(以毫秒为单位))添加到量角器配置文件中,以全局反映超时的变化。 但是,如果要为各个测试用例提供超时,则在调用browser.get()时必须传递一个附加参数,即browser.get(地址,以毫秒为单位的超时)。

test_config.js

specs: ['test_timeout.js'],
// overriding default value of getPageTimeout parameter //
      getPageTimeout: 10000,
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 10000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(3000);
   }
};

// launches the URL in the browser //
browser.get("http://the-internet.herokuapp.com");

或者,将值指定为参数以使用Selenium处理量角器中的超时:

// launches the URL in the browser and specifying the timeout as a parameter //
browser.get(http://the-internet.herokuapp.com,10000);

加载页面后活动期间的超时

在执行用于Protractor测试的Selenium测试自动化的同时,在页面上执行任何浏览器操作时, javascript框架将等待进行任何操作,直到应用程序中没有剩余的异步任务为止。 它表示所有超时以及HTTP请求均已完成。

因此,让我们用一个用例来处理带有Selenium的Protractor中的超时,在该超时中,我们将默认超时设置为6000毫秒或6秒,浏览器将在页面加载后等待,直到进行6秒钟的任何活动,然后错误地指出已计时等待6000毫秒后完成异步任务。

为此,您必须将allScriptsTimeout(超时(以毫秒为单位))添加到Protractor配置文件中,这将全局反映超时的变化。

test_config.js

specs: ['test_timeout.js'],
 
// overriding default value of getPageTimeout parameter //
      getPageTimeout: 10000,
// overriding default value of allScriptsTimeout parameter for Protractor testing//      
allScriptsTimeout: 10000,
 
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 10000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(3000);
   }

您还可以通过更改Web应用程序中的量角器测试来解决此问题。 如果AngularJS应用程序连续检查$ timeout或$ http,则量角器将无限期等待,然后超时。 您可以将$ interval用于Angular 1.2中引入的任何连续轮询。 对于Angular应用,量角器必须等到Angular Zone稳定下来。

这意味着长时间运行的异步操作将阻止您的测试继续进行。 因此,您需要在Angular区域之外执行此类任务,才能在本Protractor教程中找到解决此问题的方法。 例如:

this.ngZone.runOutsideAngular(() => {
  setTimeout(() => {
    // Any changes that are made inside this will not be reflected in the view of our application for Protractor testing //
    this.ngZone.run(() => {
      // if we run inside this block then it will detect the changes. //
    });
  }, REALLY_LONG_DELAY);
});

等待变量初始化时超时

在浏览器中启动任何URL进行量角器测试时,量角器在加载新页面时会等待角度变量出现。

让我们用一个用例来处理带有Selenium的Protractor中的超时,您将默认超时设置为8000 ms或8 sec,浏览器将等待页面加载上的angular变量,然后再进行任何活动,直到8 sec并返回错误指出在页面上找不到该角度,请重试以查找超出的角度。

为此,您必须将getPageTimeout(超时(以毫秒为单位))添加到量角器配置文件中,以全局反映超时的变化。 但是,如果要在每次浏览器加载网页期间分别提供超时,则需要在调用browser.get()时传递一个附加参数,即browser.get(地址,以毫秒为单位的超时)。

test_config.js

specs: ['test_timeout.js'],
// overriding default value of getPageTimeout parameter to handle timeouts in Protractor with Selenium//
      getPageTimeout: 10000,
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 10000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(3000);
   }
};

// launches the URL in the browser //
browser.get("http://the-internet.herokuapp.com");

或者,将值指定为参数来处理带有Selenium的量角器中的超时。

// launches the URL in the browser and specifying the timeout as a parameter //
browser.get(http://the-internet.herokuapp.com,10000);

量角器中的测试规范超时

测试规范,即量角器测试用例的“ it块”,用于定义要执行的测试用例。 如果测试用例花费很长时间执行,由于某种原因,例如测试用例的处理,那么“ it”块将失败并导致错误。

如果我们考虑一个使用Selenium处理带有Protractor的超时的示例,其中默认超时设置为15000 ms或15秒,则浏览器将等待规范完成执行直到15秒,然后导致测试结果失败。

您需要将jasmineNodeOpts(以毫秒为单位的超时)添加到量角器配置文件中,以全局反映超时的变化。 但是,如果我们希望为每个测试规范分别提供超时,则可以通过在“ it”块中传递第三个参数(即it(description,testFunc,以毫秒为单位的超时时间))来实现。

test_config.js

specs: ['test_timeout.js'],
 
// overriding default value of getPageTimeout parameter to handle timeouts in Protractor Selenium //
      getPageTimeout: 10000,
// overriding default value of allScriptsTimeout parameter //      
allScriptsTimeout: 10000,
 
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 30000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(3000);
   }

或者,通过作为参数传递:

// describing the test for the timeout example //
   describe(' Timeout Demonstration in Protractor ', function() {
 // tests to handle timeouts in Protractor Selenium//
    it('Tests to handle timeouts in protractor', function() {
    // launch the url in the browser //   
       browser.get("http://the-internet.herokuapp.com ");   
   }, 30000);
});
selenium_量角器教程:使用Selenium处理超时_第2张图片

量角器中的异步脚本超时

异步脚本超时用于指示脚本等待直到指定的超时限制,以便脚本可以在引发错误以处理Protractor Selenium中的超时之前完成其执行。

因此,让我们用一个用例来处理带有Selenium的Protractor中的超时,其中我们将默认超时设置为7000毫秒或7秒,浏览器将等待任何异步任务完成其执行,以处理Protractor Selenium中的超时,然后再继续进行处理。抛出一个错误,直到7秒钟,然后导致ScriptTimeoutError输出,表明它在等待异步任务时超时。

为了修改此行为以处理Protractor Selenium中的超时,您需要将allScriptsTimeout(超时(以毫秒为单位))添加到量角器配置文件中,这将全局反映超时的变化。

test_config.js

specs: ['test_timeout.js'],
 
// overriding default value of getPageTimeout parameter for Protractor testing //
      getPageTimeout: 10000,
// overriding default value of allScriptsTimeout parameter //      
allScriptsTimeout: 10000,
 
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 30000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(3000);
   }

在量角器中切换等待特征的方法

每当您要导航或在不使用Angular的浏览器中打开页面时,我们可以通过在调用函数browser.waitForAngularEnabled(false)时将参数传递为false来禁用等待超时的功能。

browser.waitForAngularEnabled(false);
browser.get('/my_non_angular_page.html');
element(by.id('username')).sendKeys('myusername');
element(by.id('password')).sendKeys('mypassword');
element(by.id('clickButton')).click();
browser.waitForAngularEnabled(true);
browser.get('/my_page-containing-angular.html');

但是可能发生的是,我们可以从WaitForAngular方法获取异步脚本超时异常。 在这种情况下,最重要的事情是检查网站驱动程序的超时情况,以将脚本设置为5秒钟左右,以使网站加载缓慢且缓慢。

以下是完整的代码,演示了在量角器中处理超时的行为。

// setting required config parameters //
exports.config = {
   directConnect: true,
 
   // Desired Capabilities that are passed as an argument to the web driver instance.
   capabilities: {
      'browserName': 'chrome'  // name of the browser used to test //
   },
 
   // Flavor of the framework to be used for our test case //
     framework: 'jasmine',
 
   // The patterns which are relative to the current working directory when 
 
protractor methods are invoked //
 
   specs: ['test_timeout.js'],
// overriding default value of getPageTimeout parameter //
      getPageTimeout: 10000,
// overriding default value of allScriptsTimeout parameter //
      allScriptsTimeout: 10000,
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 30000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(5000);
   }
};

test_timeout.js

// import all the required modules from selenium web driver and protractor
 
import 'selenium-webdriver';
 
import { browser, element, by, ExpectedConditions, protractor} from 'protractor'
 
 
   // describing the test for the timeout demonstration //
 describe('Timeout Demonstration in Protractor', function() {
    
browser.ignoreSynchronization = true; // disable synchronization for non  angular websites //
 
    // tests to handle timeouts in protractor //
    it('Tests to handle timeouts in protractor', function() {
 
	// launch the url in the browser //   
       browser.get(http://the-internet.herokuapp.com , 10000);
      
 browser.manage().timeouts().implicitlyWait(5000);
     
      // locate the element //                        
     element(by.xpath(" // label/ span ")).getAttribute("innerTextValue").then(function(textValue){
 
       // the value saved is assigned to the value of the text box
      element(by.xpath("//input[@type='text']")).sendKeys(textValue);
        })
    },30000);
});

在Cloud Selenium网格上处理量角器Selenium中的超时

我们可以在云Selenium网格上运行相同的Selenium测试自动化脚本来处理Protractor Selenium中的超时,该功能提供了跨各种实时浏览器和设备运行测试的功能。 为了运行本量角器教程的Selenium测试自动化脚本,我们只需要进行配置更改即可,即用于构建与LambdaTest集线器连接的驱动程序。 以下是我们对此Protractor教程进行适当修改的修订脚本,以处理Protractor Selenium中的超时。

// test_config.js //
// The test_config.js file serves as a configuration file for out Selenium test Automation case for this Protractor tutorial//
 
LT_USERNAME = process.env.LT_USERNAME || "irohitgoyal"; // LambdaTest User name
LT_ACCESS_KEY = process.env.LT_ACCESS_KEY || "r9JhziRaOvd5T4KCJ9ac4fPXEVYlOTealBrADuhdkhbiqVGdBg"; // LambdaTest Access key
 
exports.capabilities = {
  'build': ' Automation Selenium Webdriver Test Script ', // Build Name to be display in the test logs
  'name': ' Protractor Selenium Timeout Test on Chrome',  // The name of the test to distinguish amongst test cases //
  'platform':'Windows 10', //  Name of the Operating System
  'browserName': 'chrome', // Name of the browser
  'version': '79.0', // browser version to be used
  'console':false, // flag to check whether to capture console logs.
  'tunnel': false // flag to check if it is required to run the localhost through the tunnel
  'visual': false,  // flag to check whether to take step by step screenshot
  'network':false,  // flag to check whether to capture network logs
  };
 
// setting required config parameters //
exports.config = {
   directConnect: true,
 
   // Desired Capabilities that are passed as an argument to the web driver instance for Selenium test automation.
   capabilities: {
      'browserName': 'chrome'  // name of the browser used to test //
   },
 
   // Flavour of the framework to be used for our test case //
   framework: 'jasmine',
 
   // The patterns which are relative to the current working directory when 
 
protractor methods are invoked //
 
   specs: ['test_timeout.js'],
// overriding default value of getPageTimeout parameter //
      getPageTimeout: 10000,
// overriding default value of allScriptsTimeout parameter //
      allScriptsTimeout: 10000,
      jasmineNodeOpts: {
// overriding default value of defaultTimeoutInterval parameter //
      defaultTimeoutInterval: 30000
   },
   onPrepare: function () {
      browser.manage().window().maximize();
      browser.manage().timeouts().implicitlyWait(5000);
   }
};


// test_script.js //
 
// import all the required modules from selenium web driver and protractor
 
import { browser, element, by, ExpectedConditions, protractor} from 'protractor'
import 'selenium-webdriver';
 
var script = require (‘protractor’) ;
 
var webdriver = require (‘selenium-webdriver’) ;
 
// Build the web driver that we will be using in LambdaTest for this protractor tutorial
var buildDriver = function(caps) {
  return new webdriver.Builder()
    .usingServer(
      "http://" +
      LT_USERNAME +
      ":" +
      LT_ACCESS_KEY +
      "@hub.lambdatest.com/wd/hub"
    )
    .withCapabilities(caps)
    .build();
};
 
 
// describing the test for the timeout demonstration //
describe(' Timeout Demonstration in Protractor ', function() {
// disable synchronization for non  angular websites //
    browser.ignoreSynchronization = true;
 
// adding the before an event that builds the driver and triggers before the test execution
  beforeEach(function(done) {
    caps.name = this.currentTest.title;
    driver = buildDriver(caps);
    done();
  });
 
    // tests to handle timeout in Protractor Selenium//
    it(' Tests to handle timeout in protractor  ', function() {
 
 
      
 browser.manage().timeouts().implicitlyWait(5000);
     
      // locate the element for Protractor testing //                        
     element(by.xpath(" // label/ span ")).getAttribute("innerTextValue").then(function(textValue){
 
       // the value saved is assigned to the value of the text box
      element(by.xpath("//input[@type='text']")).sendKeys(textValue);
        })
    },30000);
});
 
 
 
 
 
        browser.manage().timeouts().implicitlyWait(5000)
       // launch the url in the browser //   
       browser.get(http://the-internet.herokuapp.com , 10000);                 
 
       // locate the element //                        
       
// Store the value in a web element
        WebElement ele1 = element(by.id("ele1")).getWebElement();
        // navigate to the next desired element i.e. ele1
        browser.switchTo().frame(ele1);
        // locate the new element i.e. element 3 //
        WebElement ele3 =         element(by.xpath("[@id='ele3']")).getWebElement();
        // using the switchTo method to navigate to ele 3
        browser.switchTo().frame(ele3);
        // search the element for the checkbox element by xpath locator
        WebElement checkbox  = element(by.xpath("//input[@type='checkbox']"));
        // if checkbox is not selected then click the checkbox
        checkbox.isSelected().then(function(checked){
            // if checkbox is not selected then click the checkbox
            if(! checked){
                checkbox.click();
            }
        })
            }
        });
    },30000);
});

正如我们在本量角器教程的示例中看到的那样,只需添加几行代码,我们就可以连接到LambdaTest Platform并在Cloud Selenium网格上运行Selenium测试自动化脚本。 为了进行此设置,我们需要生成所需的能力矩阵。

您可以访问LambdaTest Selenium所需的功能生成器,以生成所需的配置,通过该配置我们可以指定要在其中执行测试的环境。 另外,我们只需要在配置文件中传递LambdaTest用户名和访问密钥即可在LambdaTest平台上唯一标识我们。

以下是此Protractor教程在LambdaTest上运行Selenium测试自动化脚本的输出:

selenium_量角器教程:使用Selenium处理超时_第3张图片

另请阅读:如何使用Selenium处理量角器中的警报和弹出窗口?

结语!

这使我们得出了本《量角器》教程中有关如何处理Protractor Selenium中超时的结论。 在整个本文中,我探讨了如何处理超时并探讨了解决超时的方法。 在我们的测试脚本中实现此功能后,您将意识到它使Selenium测试自动化脚本更加有效。 这有助于对具有多个异步任务的网站执行自动浏览器测试,并且可能需要一些时间才能在浏览器窗口上呈现。

此外,向我们的网页添加超时可以使我们网页上的组件有足够的时间加载。 这使Protractor成为测试Selenium测试自动化超时的最佳框架之一。 另外,由于我们知道量角器基于Selenium,并且主要用于 自动浏览器测试,因此它继承了其许多属性。 最后,该框架还有许多其他功能,我将在以后的Protractor教程中进行讨论。

我很乐意在下面的评论部分中听到您对本文的看法。 另外,请随时在LinkedIn,Twitter或任何其他社交媒体平台上与您的朋友分享这篇文章。 目前为止就这样了。 测试愉快!!!

selenium_量角器教程:使用Selenium处理超时_第4张图片

翻译自: https://www.javacodegeeks.com/2020/07/protractor-tutorial-handling-timeouts-with-selenium.html

selenium

你可能感兴趣的:(java,javascript,python,selenium,js,ViewUI)