用Selenium突出显示WebElement并恢复原始边界

Highlighting WebElement with Selenium and restoring original border?

本文关键字:恢复 原始 边界 WebElement 显示 Selenium      更新时间:2023-09-26

我偶然发现了这个SO答案https://stackoverflow.com/a/10660734/2985796并且我试图弄清楚CCD_ 1和CCD_。

我觉得这篇文章对熟悉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返回一个代表其当前边界的SCRIPT_GET_ELEMENT_BORDER0。然后按以下方式使用。

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的?

为任何web元素返回style.border值的方法:

private String getElementBorder(WebElement elem)
{
    return (String) ((JavascriptExecutor)this).executeScript("return arguments[0].style.border", elem);
}