在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] 举报,一经查实,本站将立刻删除。