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);
});
量角器中的异步脚本超时
异步脚本超时用于指示脚本等待直到指定的超时限制,以便脚本可以在引发错误以处理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处理量角器中的警报和弹出窗口?
结语!
这使我们得出了本《量角器》教程中有关如何处理Protractor Selenium中超时的结论。 在整个本文中,我探讨了如何处理超时并探讨了解决超时的方法。 在我们的测试脚本中实现此功能后,您将意识到它使Selenium测试自动化脚本更加有效。 这有助于对具有多个异步任务的网站执行自动浏览器测试,并且可能需要一些时间才能在浏览器窗口上呈现。
此外,向我们的网页添加超时可以使我们网页上的组件有足够的时间加载。 这使Protractor成为测试Selenium测试自动化超时的最佳框架之一。 另外,由于我们知道量角器基于Selenium,并且主要用于 自动浏览器测试,因此它继承了其许多属性。 最后,该框架还有许多其他功能,我将在以后的Protractor教程中进行讨论。
我很乐意在下面的评论部分中听到您对本文的看法。 另外,请随时在LinkedIn,Twitter或任何其他社交媒体平台上与您的朋友分享这篇文章。 目前为止就这样了。 测试愉快!!!
翻译自: https://www.javacodegeeks.com/2020/07/protractor-tutorial-handling-timeouts-with-selenium.html
selenium