Is by.id better than by.tagname?



我正在使用网络驱动程序从gmail读取邮件,在这两者之间,我发现了By.id和By.tagname.之间的差异

我正试图访问一个id为":pg"的"表"。所以我可以

  1. 使用By.id(":pg")
  2. 或者使用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"的元素

按标签名称:

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之间有这种区别?

谢谢,克里斯。

:pg元素最初不在页面上。

使用By.Tag,硒不会等待:pg元素。

因为By.Id示例更具体,所以selenium将继续检查:pg元素是否存在,直到隐式等待(5秒)超时。

By。Tag一点也不具体。在findElements(By.tagName("table")上,Selenium将返回页面加载后立即出现的所有表的数组。由于:pg元素尚未出现,因此它将不在阵列中。

要回答您的问题,是的,最好使用By.Id,因为:1.更具体。2.保存代码行3.强制硒等待元素的存在。

根据您的问题,最好使用By.Id

By.tag不用于特定的数据,它实际上会搜索并返回具有指定标记名称的所有表的数组。另一方面,使用id可以获得用于识别/定位元素的适当输出。

只有在没有指定id、name或class的情况下才使用标记,如果找不到元素,最佳方式可以是By.cssSelector

感谢

最新更新