我正在使用网络驱动程序从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"的元素
按标签名称:
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。
感谢