在我的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选择器的内容的正确方法是什么?
我想测试一下,有一个“*”的标签后,但似乎没有能够正确地得到“内容”属性的值。一旦我能找到它在使用浏览器的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()方法返回包含一个元件的所有的CSS属性的值的对象,照射活性样式表,并解决任何基本计算这些值可以含有后。个人的CSS属性值,或者用CSS属性名索引通过对象提供的API来访问。
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.
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量角器我张贴,我得到了工作方案。来到我最初卡住部分 - 为什么我得到的“正常”改为“*”
>getComputedStyle(document.querySelector('label')).content
<"normal"
所以,早期我不知道::after创建标签元素中伪子元素。
在Chrome检查<label>
元件示出了以下HTML
<label>
I'm mandatory
::after
</label>
如果我click<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);
});