如何通过Selenium为元素分配id
How to assign id to an element through Selenium
在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。
- jQuery插件在为元素分配id时停止工作
- Javascript原型通用Enquries和通过数组索引分配Id
- 使用 JavaScript 为元素分配 ID
- 将一个元素的“分配 ID 值”更改为另一个元素的数据属性
- 为段落文本的一部分分配 ID
- 我无法为已加载的 Java 脚本分配 ID
- JS:如何为新创建的HTML元素分配ID
- 自动分配 ID 的最佳做法
- 为动态生成的HTML标记分配ID
- 将字符串与数组变量混合在一起,为javascript中的元素分配id
- 为表行的所有输入元素分配id和名称
- 如何为动态创建的行分配ID
- 如何在three.js应用程序中为canvas分配id
- 如何通过Selenium为元素分配id
- 如何根据文本查找HTML元素,然后分配ID
- 在Javascript中分配Id并遍历行
- jQuery -为元素分配ID
- 动态加载Div元素并分配id
- 是否可以使用JS/PHP为网页中的元素动态分配ID
- CK编辑-分配ID