如何通过Selenium为元素分配ID

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

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

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

假设您有如上例中所示的“domWrapper”实例,但您没有等式右侧;这意味着a)您不知道元素实际代表什么,b)您不知道它是如何定位的。在这两个前提条件下,是否可以使用Selenium为该元素分配一个id?所有我见过的为元素分配id的例子都利用了Javascript和定位器来找到dom中的实例。
我最初提出的问题(没有人理解 :-))
任何想法如何在Selenium中为任意元素分配id?通过IWebElement接口,我可以引用DOM中的元素,并且我知道驱动程序支持执行JavaScript,我只是不知道如何在没有id时唯一地引用一个元素。
伪代码示例(此代码使用属性定位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);
        }
    }

我理解你需要获取元素并点击它,是这样的吗?如果我理解正确,HTML代码会非常有帮助。通过某些定位器获取元素比为元素分配ID更容易。 - ievche
我们可能有一些误解吗?你的目标是获取元素还是为已定位的元素设置ID? - ievche
我可以根据定位器匹配任何特定的元素,但这是通用代码。我不知道元素是如何被定位的,而且由于它没有id,我无法直接引用它,因此有了我的问题。 - Marius
这是你要找的吗?Driver.ExecuteJavascript("arguments[0].setAttribute('id','123');", element); - ievche
真正的问题是,如果你只有Selenium中的IWebElement dom-wrapper,如何在DOM中获取该元素的引用。 - Marius
显示剩余4条评论
1个回答

4
在访问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中利用ExecuteJavascript方法,当将IWebDriver转换为IJavaScriptExecutor时:

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接