微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CodeGo.net>如何通过硒将ID分配给元素

在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);
        }
    }

解决方法:

在Selenium中访问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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐