by.id 比 by.tagname 更好吗?
我正在使用 webdriver 从 gmail 读取邮件,在这期间我发现了 By.id 和 By.tagname 之间的区别。
我正在尝试访问 id 为“:pg”的“表”。所以我可以
- 使用 By.id(":pg")
- 或使用 By.tagname("table") 并搜索带有 id 的元素 :pg
以下是两种情况的代码。
By.id:
WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
webDriver = webDriver.switchTo().frame("canvas_frame");
WebElement table1 = webDriver.findElement(By.id(":pg"));`
在上面的代码中,我直接获取了 id 为“:pg”的元素
By.tagname:
WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
List<WebElement> tables = webDriver.findElements(By.tagName("table"));
for(WebElement table2: tables){
String id = table2.getAttribute("id");
System.out.println("id: "+ id);
if(id != null && id.equals(":pg")){
System.out.println("FOUND IT!!!");
}
}
在上面的代码中,我找到了所有带有 table 标记名的元素,然后查看哪个元素的 id 为“:pg”。
这两个代码片段本质上是相同的,但使用不同的方式(By.id 或 By.tagname)。但是,使用 By.id 的第一个代码片段总是成功,而使用 By.tagname 的第二个代码片段几乎总是失败。 (但是,它会在额外等待的情况下工作)
为什么 By.id 和 By.tagname 之间存在这种差异?
谢谢, 克里斯.
I was working on reading mails from gmail using webdriver and in between I hit upon this difference between By.id and By.tagname.
I am trying to get access to a "table" whose id is ":pg". So I could
- Either use By.id(":pg")
- OR use By.tagname("table") and search for an element with id :pg
Here is the code for both cases.
By.id:
WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
webDriver = webDriver.switchTo().frame("canvas_frame");
WebElement table1 = webDriver.findElement(By.id(":pg"));`
Above code, I directly get the element which has id ":pg"
By.tagname:
WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
List<WebElement> tables = webDriver.findElements(By.tagName("table"));
for(WebElement table2: tables){
String id = table2.getAttribute("id");
System.out.println("id: "+ id);
if(id != null && id.equals(":pg")){
System.out.println("FOUND IT!!!");
}
}
Above code, I find all elements with the tagname of table and then see which one has the id ":pg".
Both these code snippets are essentially doing the same but using different ways(By.id or By.tagname). However, the first snippet of code which uses By.id always succeeds while the second snippet of code which uses By.tagname fails almost always. (It will work with additional waiting however)
Why is this difference between By.id and By.tagname?
Thanks,
Chris.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
:pg
元素最初不存在于页面上。使用
By.Tag
,selenium 将不会等待:pg
元素。由于
By.Id
示例更加具体,selenium 将继续检查:pg
元素是否存在,直到隐式等待(5 秒)超时。By.Tag 根本不具体。在
findElements(By.tagName("table")
上,Selenium 将返回页面加载后立即出现的所有表格的数组。由于:pg
元素是尚不存在,它不会在数组中。要回答您的问题,是的,最好使用
By.Id
因为:1.更加具体。
2. 节省代码行数
3. 强制selenium 等待元素存在。
The
:pg
element is not present on the page initially.Using
By.Tag
, selenium will not wait for the:pg
element.Because
By.Id
example is more specific, selenium will continue checking if the:pg
element exists until the implicit wait (5 seconds) times out.By.Tag is not specific at all. On
findElements(By.tagName("table")
, Selenium will return an array of all the tables that are present immediately after the page loads. As the:pg
element is not present yet, it will not be in the array.To answer your question, yes it is better to use
By.Id
because:1. It is more specific.
2. Saves lines of code
3. Forces selenium to wait for the element to exist.
最好根据您的问题使用By.Id。
By.tag并不用于特定数据,它实际上会搜索并返回具有指定标签名称的所有表的数组。另一方面,使用 id 您可以获得用于识别/定位元素的适当输出。
仅当未指定 id、名称或类时才查找标记,如果未找到元素,最好的方法可以是 By.cssSelector。
谢谢
It is better to use By.Id according to your question.
By.tag is not used for specific data, it actually will search and return an array of all the tables with the specified tag name. On the other hand using id you can get the appropriate output for identifying/locating element.
Go for tag only if id, name or class is not specified and the best way can be By.cssSelector if no element is found.
Thanks