Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算WebDriver WebElement的内部id?将多个元素传递给JavaScript执行器_Javascript_Firefox_Webdriver_Selenium Webdriver - Fatal编程技术网

如何计算WebDriver WebElement的内部id?将多个元素传递给JavaScript执行器

如何计算WebDriver WebElement的内部id?将多个元素传递给JavaScript执行器,javascript,firefox,webdriver,selenium-webdriver,Javascript,Firefox,Webdriver,Selenium Webdriver,我想知道WebDriver中WebElement的id是如何在内部计算的。我之所以需要它,是因为我正在编写一个扩展,在需要同时执行多个JavaScript命令的情况下,该扩展可以提高性能 检索ID的Java示例代码: RemoteWebElement element = driver.findElement( By.cssSelector("div#header > img.logo") ); String id = element.getId(); // id is someth

我想知道WebDriver中WebElement的id是如何在内部计算的。我之所以需要它,是因为我正在编写一个扩展,在需要同时执行多个JavaScript命令的情况下,该扩展可以提高性能

检索ID的Java示例代码:

RemoteWebElement element = driver.findElement(
    By.cssSelector("div#header > img.logo")
);
String id = element.getId();
// id is something like: {390f457d-406b-458a-b4a6-dfebb24aae36}
所以,我想向JavaScript执行器传递多个WebElement,我可以通过发送所有id的列表来实现吗我只需要知道这些id就可以在JavaScript中检索DOM元素。

我猜解决方案隐藏在webdriver.xpi实现中。我使用Firefox网络驱动程序

更新

好的,让我重新表述我的问题。假设我想用Javascript中的WebElement做一些事情,我可以这样做:

((JavascriptExecutor) driver).executeScript("jQuery(arguments[0]).doSomething()", myElement);
<div id="header">
 <img class="logo" id="firstID" src="foo.jpg" />

但是如何将多个WebElements(任意数量)传递给脚本?

顺便说一句,
findElements()
方法会重新返回元素列表。因此,您的代码更像:

List<WebElement> elements = driver.findElements(By.cssSelector("div#header > img.logo");
以上内容将遍历所有元素,并在循环中逐个使用它们

另一种方法是将
WebElement
包装到您的自定义类中,但这样您就必须实现所有抽象方法:

public class MyWebElement implements WebElement{
 private int id; // ID of the element which you can define later on
 private WebElement theElement // wrap around this beauty
 // ..
}

好的,如果我现在理解正确,你的DOM中有更多的图像。因此,您的HTML如下所示:

((JavascriptExecutor) driver).executeScript("jQuery(arguments[0]).doSomething()", myElement);
<div id="header">
 <img class="logo" id="firstID" src="foo.jpg" />
或者通过一些简单的搜索将其传递给方法。(如检查元件,然后执行以下操作):

好的。这样就可以做到:

WebElement element = driver.findElement(By.cssSelector("div#header > img.logo"));
String id = element.getAttribute("id");

上面应该将您的
firstID
作为字符串值返回。我从未在测试中尝试过它,但我希望它能起作用

我相信JavascriptExecutor.ExecuteScript()方法会将WebElements集合作为参数。项目中的单元测试表明这是可能的。如果是这样,为什么下面的方法不起作用

List<WebElement> elements = driver.findElements(By.cssSelector("div#header > img.logo"));
((JavascriptExecutor)driver).ExecuteScript("for (var i = 0; i < arguments[0].length; i++) { jQuery(arguments[0][i]).doSomething(); }", elements);
List elements=driver.findElements(By.cssSelector(“div#header>img.logo”);
((JavascriptExecutor)driver).ExecuteScript(“for(var i=0;i
以下示例适用于使用当前源代码(Java代码)的我:

WebDriver=newfirefoxdriver();
驱动程序。获取(“http://www.google.com");
列表元素=driver.findElements(按.tagName(“div”));
字符串s=(字符串)((JavascriptExecutor)驱动程序).executeScript(“变量s=”;for(变量i=0;i<参数[0]。长度;i++){s+=参数[0][i]。标记名;}返回s;”,元素);
driver.quit();
系统输出打印项次;

我收到控制台窗口打印的“divdiv…”。

很抱歉我的代码中有错误,我已经更正了。这只是一个展示FirefoxWebDriver内部id格式的示例。我仍然需要一种方法来访问相应的元素,只需要知道JavaScript.Ahh中的这个id!我完全误解了你想要实现的目标。我将发布另一个答案:)这仍然不是我想要的。我不知道如何正确地表达自己,以便你能看到我正在努力做什么。这是一项一般性任务,不限于图像。假设我有一个
findElements()
命令,它返回
WebElement
对象的列表。我想通过在列表中调用
getId()
来放置所有内部id(我不是说html id属性)。此列表发送给JavaScript执行器,该执行器只需知道这些id即可检索相应的元素。但WebElement内部id与真实世界id无关。WebElement是DOM中一个HTML元素的Java表示。JavaScript应该与真正的HTML一起使用。为什么Javascript只知道ID?我在这里迷路了…谢谢你的帮助。我更新了我的问题,也许现在更精确了。顺便说一句,我在java WebDriver实现中没有找到getID…它是在
RemoteWebElement
中定义的:啊!正在查看
WebElement
my bad:)您可以尝试使用我的“for cycle”方法,但它会一个接一个地使用。另一种方法是在测试时运行多线程,但我在Java中并没有那么先进,无法真正帮助您使用多线程方法…谢谢,这看起来很有希望,但似乎产生了一个错误(使用了对象数组,如
TestCanHandleanArrayFelementsAsanObjectArray()
中所示):
参数属于非法类型:[Ljava.lang.Object;
在类
WebElementToJsonConverter
中,您可以看到WebElementToJsonConverter数组和对象数组都没有处理程序……我稍微简化了示例。不需要对象数组中间步骤。在WebElementToJsonConverter中,有一个用于集合的处理程序,其中的列表是第一,注意转换器是递归的,所以它也应该将列表中的所有元素转换为JSON表示。非常感谢,这对我很有帮助。我完全没有意识到转换器是递归的。我还在为细节苦苦挣扎,但现在它似乎可以工作了!
List<WebElement> elements = driver.findElements(By.cssSelector("div#header > img.logo"));
((JavascriptExecutor)driver).ExecuteScript("for (var i = 0; i < arguments[0].length; i++) { jQuery(arguments[0][i]).doSomething(); }", elements);
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
List<WebElement> elements = driver.findElements(By.tagName("div"));
String s = (String)((JavascriptExecutor)driver).executeScript("var s=''; for (var i = 0; i < arguments[0].length; i++) { s += arguments[0][i].tagName; } return s;", elements);
driver.quit();
System.out.println(s);