如何通过Selenium为元素分配id

时间:2013-07-01 07:52:03

标签: c# javascript selenium

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

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

假设您有“domWrapper”实例,如上例所示,但您没有方程式的右侧;这意味着你a)不知道元素实际代表什么,b)你不知道它是如何定位的。鉴于这两个前提条件是否可以使用selenium为元素分配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);
        }
    }

1 个答案:

答案 0 :(得分: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,我们可以利用我们在将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。