我正在使用webdriver从gmail阅读邮件,在我之间我发现了By.id和By.tagname之间的这种区别。
我正在尝试访问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之间存在差异?
谢谢, 克里斯。
答案 0 :(得分:6)
最初页面上不存在:pg
元素。
使用By.Tag
,selenium不会等待:pg
元素。
因为By.Id
示例更具体,所以selenium将继续检查:pg
元素是否存在,直到隐式等待(5秒)超时。
By.Tag根本不具体。在findElements(By.tagName("table")
上,Selenium将返回页面加载后立即出现的所有表的数组。由于:pg
元素尚未出现,因此它不在数组中。
要回答您的问题,是的,最好使用By.Id
,因为:
1.更具体。
2.保存代码行
3.强制selenium等待元素存在。
答案 1 :(得分:1)
根据您的问题,最好使用 By.Id 。
By.tag不用于特定数据,它实际上将搜索并返回具有指定标记名称的所有表的数组,因此使用id可以获得适当的输出。
仅当未指定id ya类时才转到标记,如果找不到任何元素,则最好的方法可以是 By.cssSelector 。
由于