selenium .get Element By() 索引 0 与单个 .getElementByid()
Posted
技术标签:
【中文标题】selenium .get Element By() 索引 0 与单个 .getElementByid()【英文标题】:selenium .getElementsBy() index 0 vs single .getElementBy() 【发布时间】:2021-05-03 06:57:35 【问题描述】:我正在学习 Selenium,但有一个我找不到答案的问题。
除了“By”定位符之外,两者之间的规范是否有任何真正的区别
WebDriver.getElementsBy().get(0)
与单身
WebDriver.getElementBy()
它们是否来自同一来源?他们在内部有相同的方法吗?如果我开始使用getElementsBy().get(0)
而不是单个的,它会影响我的测试用例吗?'
谢谢。
【问题讨论】:
【参考方案1】:实际上getElementBy()
内部使用getElementsBy().get(0)
,所以它们在功能上几乎相同。
见source code:
/**
* Find a single element. Override this method if necessary.
*
* @param context A context to use to find the element.
* @return The WebElement that matches the selector.
*/
public WebElement findElement(SearchContext context)
List<WebElement> allElements = findElements(context);
if (allElements == null || allElements.isEmpty())
throw new NoSuchElementException("Cannot locate an element using " + toString());
return allElements.get(0);
不同之处是,如果getElementBy()
的查找失败,您将得到异常,与后一种情况不同,您不会。
【讨论】:
奇怪... W3C 标准提到了 2 个独立的方法:find element 和 find elementS -> 第二个返回 json 数组;在.net 实现中public virtual IWebElement FindElement(string mechanism, string value) Dictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add("using", mechanism); parameters.Add("value", value); Response commandResponse = this.Execute(DriverCommand.FindElement, parameters); return this.GetElementFromResponse(commandResponse);
是的,但是 Java 绑定使用元素查找。我认为这是因为 W3C 标准还很年轻,所以并不是所有的客户都完全支持它。【参考方案2】:
-
findElement() 用于通过提供的定位器机制(如 id、xpath、css 等)查找当前页面上的第一个 Web 元素,而 findElements() 用于通过提供的定位器机制(如 id)查找当前页面上的所有 Web 元素, xpath、css 等。
findElement() 将仅返回第一个 Web 元素,即使定位器定位多个 Web 元素也是如此。 findElements() 返回所有匹配的 Web 元素。 findElement() 方法在内部调用 findElements() 方法本身并返回第一个索引的 Web 元素。
findElement() 方法的返回类型是 WebElement,而 findElements() 方法的返回类型是 List。
如果没有找到匹配的元素,findElement() 将抛出 NoSuchElementException。如果没有找到匹配的元素, findElements() 将返回一个空列表。这就是 findElements() 是检查 Web 元素不存在的更好方法的原因。请更多地关注这一点。 NoSuchElementException 由 findElement() 而非 findElements() 引发。
结论:尽可能使用findelements,因为您将避免NoSuchElementException,而且它应该更快,因为findelement正在调用findelements并且如果找到则只返回第一个元素。
【讨论】:
以上是关于selenium .get Element By() 索引 0 与单个 .getElementByid()的主要内容,如果未能解决你的问题,请参考以下文章
在 selenium 中不推荐使用 find_element_by_* 命令