by.id比by.tagname好吗?

时间:2011-06-16 12:34:04

标签: testing automation automated-tests webdriver

我正在使用webdriver从gmail阅读邮件,在我之间我发现了By.id和By.tagname之间的这种区别。

我正在尝试访问ID为“:pg”的“表”。所以我可以

  1. 使用By.id(“:pg”)
  2. 或使用By.tagname(“table”)并搜索id为:pg
  3. 的元素

    以下是两种情况的代码。

    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之间存在差异?

    谢谢, 克里斯。

2 个答案:

答案 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

由于