如何通过Selenium为元素分配id
本文关键字:分配 id 元素 何通过 Selenium | 更新日期: 2023-09-27 18:20:43
在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。