我正在为我的应用程序编写自动化测试。我想到的其中一个测试是检查应用程序中的XSS漏洞(特别是脚本/标记注入)。
假设我有一个接受文本输入的字段:
<input id="messageInput" name="message" />
并假设它打印输入消息,如下所示:
<p id="messageOutput">You entered ${message}</p>
最简单的测试用例会尝试输入标记,例如<b>Hello</b>
而不是纯文本。
如何验证标记是否实际上未在浏览器上呈现?我能想到的一种肮脏方式是转到显示输入的元素。
@FindBy(id = "messageOutput")
WebElement messageOutput;
public boolean isMarkupRendered() {
try {
messageOutput.findElement(By.tagName("b"));
return true;
} catch (NoSuchElementException e) {
return false;
}
}
然而,这将我的方法与我可能提供的测试数据联系起来 - 它不够通用,无法使用输入,例如
<script>document.body.style.backgroundColor='red'</script>
这里有什么建议吗? Selenium是否提供了更简洁的方法?
答案 0 :(得分:1)
到目前为止,我遇到了获取元素css属性(特别是颜色):
public String jsGetColor(String css){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x=$(\'"+css+"\');");
stringBuilder.append("return x.css('color')");
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
所以我的想法是用元素的css属性进行操作,如果你肯定知道它是什么类型的元素:文本,图片等。
- 我如何验证标记是否实际上没有在浏览器上呈现? - 有很多方法可以解决硒存在或不存在的问题:
input.findElements(By.xpath("//xpath")).size() > 0
driver.findElement(By.cssSelector(html>blablabla....)).isDisplayed()
public bool IsElementPresent(By selector)
{
return driver.FindElements(selector).Any();
}
希望这能以某种方式帮助你)