如何 select 量角器中日期选择器的日期
How to select date of datepicker in protractor
我正在通过量角器自动化应用程序,作为一个测试用例的一部分需要 select 日期,日期选择器定义如下。我尝试使用无法正常工作的 sendkeys select 日期。
element(by.lid("new-transaction-doat-field)).sendKeys("24 Aug 2019");
请帮我输入 select 日期。
注意:lid是自定义属性,要selectlid的值,在量角器中创建自定义属性方法
你试过输入 .sendKeys()
了吗?
element(by.model('dateModel')).sendKeys('dd mmm yyyy');
您给定的代码中有两个问题:
1) 应该与输入 html 元素交互
2) sendKeys()
无法与只读输入 html 元素交互。
// because protractor not support invoke setAttribute api directly,
// need to using executeScript to inject DOM Javascript snippet into browser
// then execute the snippet in browser
browser.executeScript(
"arguments[0].setAttribute('value', arguments[1])",
element(by.css( '[lid="new-transaction-doat-field"] > span > input')).getWebElement(),
"24 Aug 2019"
)
请记住,setAttribute()
并不是模拟用户与来自 UI 的网页进行交互。
请确认从您的测试角度来看是可以接受的。
我通过日期选择器找到了 select 日期的解决方案,其中 'sendKeys' 将无法工作,因为输入被禁用。解决方案就像我们将如何手动遍历日历和 select 日期。
代码如下:
this.selectDate = function (dateElement, dateValue, yearButton, arrowButton) {
var splitDate = dateValue.split('/');
var year = splitDate[2];
var month = splitDate[1];
var day = splitDate[0];
var monthName = getMonthName(month);
dateElement.click()
.then(() => yearButton.click())
.then(() => yearButton.click())
.then(() => selectYear(year, arrowButton))
.then(() => element(by.xpath("//span[text()='" + year + "']")).click())
.then(() => element(by.xpath("//span[text()='" + monthName + "']")).click())
.then(() => element(by.xpath("//span[text()='" + day + "']")).click());
};
async function selectYear(year, arrowButton) {
for(var i=0; i < 10; i++) {
var present = await element(by.xpath("//span[text()='" + year + "']")).isPresent()
if(present) {
break;
} else {
await arrowButton.click();
}
}
}
函数将输入作为 dateElement、dateValue、yearButton - 这是遍历年份的中心按钮,arrowButton - 日历中的上一个或下一个按钮
第一个脚本点击上图中中间的年份按钮 'September 2019' ,在“2019”年历到来之后,它再次点击它。
那么2001年到2019年的日历如下
如果年份显示它点击它否则它点击 'previous' 或 'next' 按钮基于 select 的日期直到它被显示(循环 10 次搜索对于这一年,如果不是在 10 次点击中抛出错误)。
点击年之后,点击月和日。
我正在通过量角器自动化应用程序,作为一个测试用例的一部分需要 select 日期,日期选择器定义如下。我尝试使用无法正常工作的 sendkeys select 日期。
element(by.lid("new-transaction-doat-field)).sendKeys("24 Aug 2019");
请帮我输入 select 日期。
注意:lid是自定义属性,要selectlid的值,在量角器中创建自定义属性方法
你试过输入 .sendKeys()
了吗?
element(by.model('dateModel')).sendKeys('dd mmm yyyy');
您给定的代码中有两个问题:
1) 应该与输入 html 元素交互
2) sendKeys()
无法与只读输入 html 元素交互。
// because protractor not support invoke setAttribute api directly,
// need to using executeScript to inject DOM Javascript snippet into browser
// then execute the snippet in browser
browser.executeScript(
"arguments[0].setAttribute('value', arguments[1])",
element(by.css( '[lid="new-transaction-doat-field"] > span > input')).getWebElement(),
"24 Aug 2019"
)
请记住,setAttribute()
并不是模拟用户与来自 UI 的网页进行交互。
请确认从您的测试角度来看是可以接受的。
我通过日期选择器找到了 select 日期的解决方案,其中 'sendKeys' 将无法工作,因为输入被禁用。解决方案就像我们将如何手动遍历日历和 select 日期。
代码如下:
this.selectDate = function (dateElement, dateValue, yearButton, arrowButton) {
var splitDate = dateValue.split('/');
var year = splitDate[2];
var month = splitDate[1];
var day = splitDate[0];
var monthName = getMonthName(month);
dateElement.click()
.then(() => yearButton.click())
.then(() => yearButton.click())
.then(() => selectYear(year, arrowButton))
.then(() => element(by.xpath("//span[text()='" + year + "']")).click())
.then(() => element(by.xpath("//span[text()='" + monthName + "']")).click())
.then(() => element(by.xpath("//span[text()='" + day + "']")).click());
};
async function selectYear(year, arrowButton) {
for(var i=0; i < 10; i++) {
var present = await element(by.xpath("//span[text()='" + year + "']")).isPresent()
if(present) {
break;
} else {
await arrowButton.click();
}
}
}
函数将输入作为 dateElement、dateValue、yearButton - 这是遍历年份的中心按钮,arrowButton - 日历中的上一个或下一个按钮
第一个脚本点击上图中中间的年份按钮 'September 2019' ,在“2019”年历到来之后,它再次点击它。
那么2001年到2019年的日历如下
如果年份显示它点击它否则它点击 'previous' 或 'next' 按钮基于 select 的日期直到它被显示(循环 10 次搜索对于这一年,如果不是在 10 次点击中抛出错误)。
点击年之后,点击月和日。