【发布时间】:2015-12-16 07:56:10
【问题描述】:
我偶然发现了这个 SO 答案 https://stackoverflow.com/a/10660734/2985796 并试图了解 SCRIPT_GET_ELEMENT_BORDER 和 SCRIPT_UNHIGHLIGHT_ELEMENT 是如何实例化的。
我觉得这篇文章对熟悉 JS 的人来说是有意义的,但遗憾的是我从来没有接触过它。我想做的基本上是重新创建这个答案,但考虑到我的应用程序。我所做的是扩展 Selenium 的 FirefoxDriver 以覆盖 FindElement 函数。在新功能中,找到的WebElement 会突出显示并记住。当再次调用该函数时,记住的元素的边框设置为none。正如答案所指出的那样,它删除了原始边框。我想在高亮完成后保留原来的边框。
到目前为止,这是我的课程FirefoxDriverEx
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class FirefoxDriverEx extends FirefoxDriver
{
private WebElement LastHighlightedElement = null;
private static final String HIGHLIGHT_BOARDER_JS = "arguments[0].style.border='3px solid red'";
private static final String UNHIGHLIGHT_BOARDER_JS = "arguments[0].style.border='none'";
@Override
public WebElement findElement(By by)
{
UndoHighlight();
WebElement foundElement = super.findElement(by);
if (this instanceof JavascriptExecutor)
{
((JavascriptExecutor)this).executeScript(HIGHLIGHT_BOARDER_JS, foundElement);
LastHighlightedElement = foundElement;
}
return foundElement;
}
private void UndoHighlight()
{
if(LastHighlightedElement != null)
{
try
{
if (this instanceof JavascriptExecutor)
((JavascriptExecutor)this).executeScript(UNHIGHLIGHT_BOARDER_JS, LastHighlightedElement);
LastHighlightedElement = null;
}
catch(Exception ex) { }
}
}
}
我想做的是创建一个函数GetElementBorder,当传递一个WebElement 时,它返回一个String,代表它的当前边界。然后按照下面的方式使用它。
public class FirefoxDriverEx extends FirefoxDriver
{
private String LastElementBorder = null;
private WebElement LastHighlightedElement = null;
private static final String HIGHLIGHT_BOARDER_JS = "arguments[0].style.border='3px solid red'";
@Override
public WebElement findElement(By by)
{
UndoHighlight();
WebElement foundElement = super.findElement(by);
if (this instanceof JavascriptExecutor)
{
((JavascriptExecutor)this).executeScript(HIGHLIGHT_BOARDER_JS, foundElement);
LastElementBorder = GetElementBorder(foundElement);
LastHighlightedElement = foundElement;
}
return foundElement;
}
private void UndoHighlight()
{
if(LastHighlightedElement != null && LastElementBorder != null)
{
try
{
String setLastBorderJS = "arguments[0].style.border='" + LastElementBorder + "'";
if (this instanceof JavascriptExecutor)
((JavascriptExecutor)this).executeScript(setLastBorderJS, LastHighlightedElement);
LastHighlightedElement = null;
LastElementBorder = null;
}
catch(Exception ex) { }
}
}
private String GetElementBorder(WebElement elem)
{
return null;
}
}
我猜在上面的链接答案下,我看不到回答者如何从SCRIPT_GET_ELEMENT_BORDER 下显示的JS 到代表边界的String?
【问题讨论】:
-
您想突出显示与自定义
findElement方法一起使用的所有 Web 元素,还是要创建一个为任何 Web 元素返回style.border值的方法? -
我想突出显示使用自定义
findElement方法找到的最后一个WebElement并创建一个自定义方法,该方法返回给定WebElement的style.border。第一部分已“完成”,但依赖于自定义方法正常工作的事实。目前,自定义方法返回null,但应将style.border作为可在UndoHighlight方法中使用的字符串返回。我认为这与链接的问题有关,但我不知道在 Q 中它们如何从给定的 JS 转到代表style.border的String。
标签: javascript java selenium