量角器中 after CSS 选择器的测试内容
Testing contents of after CSS selector in protractor
在我的 HTML 中有如下元素
HTML:
<hmtl>
<head>
<style>
label::after {
content: " *"
}
</style>
</head>
<body>
<label> I'm mandatory</label>
</body>
</hmtl>
那么在浏览器上显示的是:
I'm mandatory *
查询选择器
>getComputedStyle(document.querySelector('label')).content
<"normal"
所以我看到 normal
而不是 *
.
我看不出 normal
是从哪里来的。这是测试 ::after
CSS 选择器内容的正确方法吗?
我想测试标签后面有一个“*”,但似乎无法正确获取"content" 属性的值。一旦我能够在使用浏览器 DOM API 中找到它,我最终想在量角器中测试它。
更新
我在 - Selenium WebDriver get text from CSS property "content" on a ::before pseudo element 找到了答案。
现在的问题是我将如何在量角器上测试它。
const label = document.querySelector('label'); // "normal";
console.log(label);
const labelAfter = getComputedStyle(label, ':after').content;
console.log(labelAfter == "normal");
label::after {
content: " *"
}
<label> I'm mandatory</label>
Window.getComputedStyle()
Window.getComputedStyle() 方法 returns 包含元素所有 CSS 属性值的对象,在应用活动样式表并解析这些值可能包含的任何基本计算之后。通过对象提供的 API 或通过使用 CSS 属性 名称进行索引来访问单个 CSS 属性 值。
语法:
var style = window.getComputedStyle(element [, pseudoElt]);
element
The Element for which to get the computed style.
pseudoElt (Optional)
A string specifying the pseudo-element to match. Omitted (or null) for real elements.
The returned style is a live CSSStyleDeclaration object, which updates automatically when the element's styles are changed.
您可以在 WebDriver select element that has ::before
中找到相关讨论
使用伪元素
getComputedStyle()
可以从伪元素中提取样式信息(例如 ::after
、::before
、::marker
、::line-marker
.
根据HTML,<style>
如下:
<style>
label::after {
content: " *"
}
</style>
实施为:
<label> I'm mandatory</label>
要检索您需要:
var label = document.querySelector('label');
var result = getComputedStyle(label, ':after').content;
console.log('the generated content is: ', result); // returns ' *'
参考
因为我的问题具体是 w.r.t 量角器,所以我发布了我得到的解决方案。来到我最初被卡住的部分 - 为什么我得到 "normal" 而不是 " *"
>getComputedStyle(document.querySelector('label')).content
<"normal"
所以早些时候我没有意识到 ::after 在 label 元素中创建了一个伪子元素。
检查 Chrome 中的 <label>
元素显示以下 HTML
<label>
I'm mandatory
::after
</label>
如果我单击 <label>
元素并检查计算选项卡,我可以看到 content
属性 的值是 normal
.
但是,如果我单击 ::after
伪元素,我可以在计算选项卡中看到 content
属性 的值是 " *"
.
如其他答案中所述,getComputedStyle()
将伪元素作为第二个参数,是获取“::after
”的 CSS 属性 值的唯一方法.问题的症结在于量角器没有 getComputedStyle()
的等效项,因此我们必须依赖 browser.executeScript()
,如下所示:
let labelHeader = 'I'm mandatory *';
// Passing label element separately as in the real test case, it would be extracted from parent
// enclosing element and need to be able to pass it as a parameter to browser.executeScript().
let label = element(by.css('label'));
browser.executeScript("return window.getComputedStyle(arguments[0], ':after').content",
label)
.then ((suffixData: string) => {
// suffixData comes out to be '" *"', double quotes as part of the string.
// So get rid of the first and last double quote character
suffixData = suffixData.slice(1, suffixData.length - 1);
labelText += suffixData;
expect(labelText).toBe(labelHeader);
});
在我的 HTML 中有如下元素
HTML:
<hmtl>
<head>
<style>
label::after {
content: " *"
}
</style>
</head>
<body>
<label> I'm mandatory</label>
</body>
</hmtl>
那么在浏览器上显示的是:
I'm mandatory *
查询选择器
>getComputedStyle(document.querySelector('label')).content
<"normal"
所以我看到 normal
而不是 *
.
我看不出 normal
是从哪里来的。这是测试 ::after
CSS 选择器内容的正确方法吗?
我想测试标签后面有一个“*”,但似乎无法正确获取"content" 属性的值。一旦我能够在使用浏览器 DOM API 中找到它,我最终想在量角器中测试它。
更新
我在 - Selenium WebDriver get text from CSS property "content" on a ::before pseudo element 找到了答案。 现在的问题是我将如何在量角器上测试它。
const label = document.querySelector('label'); // "normal";
console.log(label);
const labelAfter = getComputedStyle(label, ':after').content;
console.log(labelAfter == "normal");
label::after {
content: " *"
}
<label> I'm mandatory</label>
Window.getComputedStyle()
Window.getComputedStyle() 方法 returns 包含元素所有 CSS 属性值的对象,在应用活动样式表并解析这些值可能包含的任何基本计算之后。通过对象提供的 API 或通过使用 CSS 属性 名称进行索引来访问单个 CSS 属性 值。
语法:
var style = window.getComputedStyle(element [, pseudoElt]); element The Element for which to get the computed style. pseudoElt (Optional) A string specifying the pseudo-element to match. Omitted (or null) for real elements. The returned style is a live CSSStyleDeclaration object, which updates automatically when the element's styles are changed.
您可以在 WebDriver select element that has ::before
中找到相关讨论
使用伪元素
getComputedStyle()
可以从伪元素中提取样式信息(例如 ::after
、::before
、::marker
、::line-marker
.
根据HTML,<style>
如下:
<style>
label::after {
content: " *"
}
</style>
实施为:
<label> I'm mandatory</label>
要检索您需要:
var label = document.querySelector('label');
var result = getComputedStyle(label, ':after').content;
console.log('the generated content is: ', result); // returns ' *'
参考
因为我的问题具体是 w.r.t 量角器,所以我发布了我得到的解决方案。来到我最初被卡住的部分 - 为什么我得到 "normal" 而不是 " *"
>getComputedStyle(document.querySelector('label')).content
<"normal"
所以早些时候我没有意识到 ::after 在 label 元素中创建了一个伪子元素。
检查 Chrome 中的 <label>
元素显示以下 HTML
<label>
I'm mandatory
::after
</label>
如果我单击 <label>
元素并检查计算选项卡,我可以看到 content
属性 的值是 normal
.
但是,如果我单击 ::after
伪元素,我可以在计算选项卡中看到 content
属性 的值是 " *"
.
如其他答案中所述,getComputedStyle()
将伪元素作为第二个参数,是获取“::after
”的 CSS 属性 值的唯一方法.问题的症结在于量角器没有 getComputedStyle()
的等效项,因此我们必须依赖 browser.executeScript()
,如下所示:
let labelHeader = 'I'm mandatory *';
// Passing label element separately as in the real test case, it would be extracted from parent
// enclosing element and need to be able to pass it as a parameter to browser.executeScript().
let label = element(by.css('label'));
browser.executeScript("return window.getComputedStyle(arguments[0], ':after').content",
label)
.then ((suffixData: string) => {
// suffixData comes out to be '" *"', double quotes as part of the string.
// So get rid of the first and last double quote character
suffixData = suffixData.slice(1, suffixData.length - 1);
labelText += suffixData;
expect(labelText).toBe(labelHeader);
});