使用变量量角器链接元素?
Protractor Chained Elements by Using Variables?
我正在努力使 Protractor 中的 pageObjects 尽可能干净,但是 运行 反对选择子元素时的某些行为。
这个有效:
var parent = element(by.css('.parent-class'));
parent.element(by.css('.child-class')).getText();
然而这不是:
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.child.getText();
有没有办法像第二个例子那样做?我不想让元素定位器遍及我的 pageObjects 上的所有方法,但似乎这是定位子元素的唯一方法?
在实际应用中,我有一长串卡片,我从中筛选出我正在寻找的卡片。然后我想用卡片的子元素做一些事情。
您可以使用 locator()
函数获取子元素的定位符并使用它来查找父元素的子元素。这类似于您在评论中提供的解决方案,但允许您将页面对象上的所有属性定义为 Web 元素,而不是元素和定位器的混合:
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.element(child.locator()).getText();
我有很多下面的代码:
var parent = element(by.css('.parent-class'));
var child = parent.element(by.css('.child-class'));
child.getText();
但据我了解,您有很多 children 并且您不想列出所有变体。
除 Nathan Thompson 的回答外,您还可以在 object 页中使用辅助函数来查找子元素:
function getCard(parent, child) { // Or getChild()
return element(by.css(parent)).element(by.css(child));
}
function getCardText(parent, child) { // Or getChildText
return getCard(parent, child).getText();
}
那么你可以在规范中写:
expect(cardPage.getCardText('.parent-class', '.child-class')).toBe('...');
我想提一下,使用 5.2.2 版本这个实现有点不同。
要获得实际的选择器值,您必须使用以下代码
let selector = child.locator().value
这是因为locator returns 一个包含selector 和其他属性的对象,但在这种情况下,您只需要selector。
这是方法 locator()
返回的内容
name(name) {
return By.css('*[name="' + escapeCss(name) + '"]');
}
{ using: 'css selector', value: '.child-class' }
现在应该如何实施。
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.element(child.locator().value).getText();
//short hand
var parent = $('.parent-class');
var child = $('.child-class')
parent.$(child.locator().value).getText();
我正在努力使 Protractor 中的 pageObjects 尽可能干净,但是 运行 反对选择子元素时的某些行为。
这个有效:
var parent = element(by.css('.parent-class'));
parent.element(by.css('.child-class')).getText();
然而这不是:
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.child.getText();
有没有办法像第二个例子那样做?我不想让元素定位器遍及我的 pageObjects 上的所有方法,但似乎这是定位子元素的唯一方法?
在实际应用中,我有一长串卡片,我从中筛选出我正在寻找的卡片。然后我想用卡片的子元素做一些事情。
您可以使用 locator()
函数获取子元素的定位符并使用它来查找父元素的子元素。这类似于您在评论中提供的解决方案,但允许您将页面对象上的所有属性定义为 Web 元素,而不是元素和定位器的混合:
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.element(child.locator()).getText();
我有很多下面的代码:
var parent = element(by.css('.parent-class'));
var child = parent.element(by.css('.child-class'));
child.getText();
但据我了解,您有很多 children 并且您不想列出所有变体。
除 Nathan Thompson 的回答外,您还可以在 object 页中使用辅助函数来查找子元素:
function getCard(parent, child) { // Or getChild()
return element(by.css(parent)).element(by.css(child));
}
function getCardText(parent, child) { // Or getChildText
return getCard(parent, child).getText();
}
那么你可以在规范中写:
expect(cardPage.getCardText('.parent-class', '.child-class')).toBe('...');
我想提一下,使用 5.2.2 版本这个实现有点不同。 要获得实际的选择器值,您必须使用以下代码
let selector = child.locator().value
这是因为locator returns 一个包含selector 和其他属性的对象,但在这种情况下,您只需要selector。 这是方法 locator()
返回的内容name(name) {
return By.css('*[name="' + escapeCss(name) + '"]');
}
{ using: 'css selector', value: '.child-class' }
现在应该如何实施。
var parent = element(by.css('.parent-class'));
var child = element(by.css('.child-class'));
parent.element(child.locator().value).getText();
//short hand
var parent = $('.parent-class');
var child = $('.child-class')
parent.$(child.locator().value).getText();