如何通过Selenium为元素分配id

How to assign id to an element through Selenium

本文关键字:分配 id 元素 何通过 Selenium      更新时间:2023-09-26

在Selenium中,您可以访问通过IWebElement实例操作的浏览器的底层DOM。像这样:

IWebElement domWrapper = driver.FindElement(By.Name("q"));

假设你有上面例子中显示的"domWrapper"实例,但是你没有等式的右边;这意味着你a)不知道元素实际上代表什么,b)你不知道它是如何定位的。给定这两个先决条件,是否可以使用硒为元素指定id?我看到的为元素分配id的所有示例都利用javascript和定位器在dom中查找实例。

我最初是如何表达这个问题的(没有人理解:-)

关于如何在Selenium中为任意元素分配id,有什么想法吗?我通过IWebElement接口引用了DOM中的元素,我知道驱动程序支持Javascript的执行,我只是不知道如何在没有id的情况下唯一引用元素。

Psedu代码示例(这段代码定位dom元素,通过使用它唯一设置的属性来操作id,在我的情况下,我没有这样的唯一属性)。

    public string Id
    {
        get { return GetAttribute("id"); }
        set
        {
            var finder = string.Format("document.querySelector('[{0}='"{1}'"]')", "data-bind", element.GetAttribute("data-bind"));
            string setId = "('id', '_id__'+(Math.floor(Math.random()*10000000)+1));";
            string js = finder + ".setAttribute" + setId + ";";
            Driver.ExecuteJavascript(js);
        }
    }

访问DOM时,Selenium中IWebElement的实现实际上是"真实"DOM元素的代理(相当于执行document.getElementsByClass或类似操作)。这反过来意味着您可以将IWebElement作为传递给浏览器的Javascript方法的参数进行传递。

要做到这一点,最简单的方法是向浏览器传递一个脚本,该脚本创建一个接受两个参数的新函数——DOM元素和新Id:

在Javascript中,函数如下所示:

var setId = function(elem, newId)
{
   elem.id = newId
};

我们可以这样称呼它:

setId(document.elementFromPoint(1, 2), 'myNewId');

因此,从Selenium中,我们可以使用在将IWebDriver转换为IJavaScriptExecutor:时获得的ExecuteJavascript方法

public void SetIdForElement(IWebElement element, string id)
{
     // same as above, compressed to a one-liner.
     string scriptString = "sId=function(e, i){e.id = i;};sId(arguments[0], arguments[1]);"
     ((IJavaScriptExecutor)driver).ExecuteScript(scriptString, element, id);
}

现在,您可以轻松地为Selenium测试中可以访问的任何元素设置ID。