【问题标题】:Highlighting WebElement with Selenium and restoring original border?使用 Selenium 突出显示 WebElement 并恢复原始边框?
【发布时间】:2015-12-16 07:56:10
【问题描述】:

我偶然发现了这个 SO 答案 https://stackoverflow.com/a/10660734/2985796 并试图了解 SCRIPT_GET_ELEMENT_BORDERSCRIPT_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 并创建一个自定义方法,该方法返回给定WebElementstyle.border。第一部分已“完成”,但依赖于自定义方法正常工作的事实。目前,自定义方法返回null,但应将style.border 作为可在UndoHighlight 方法中使用的字符串返回。我认为这与链接的问题有关,但我不知道在 Q 中它们如何从给定的 JS 转到代表 style.borderString

标签: javascript java selenium


【解决方案1】:

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

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

【讨论】:

  • 嗯,我认为这正是我想要的。我很快就会在这里试一试,然后告诉你。谢谢!
  • 注意事项 - 您需要将值转换为字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多