2011-06-16 48 views
2

我正在使用webdriver從gmail閱讀郵件,並且在兩者之間敲擊By.id和By.tagname之間的差異。by.id比by.tagname更好嗎?

我想獲得一個「表」,其ID爲「:PG」。所以,我可以

  1. 要麼使用By.id( 「:PG」)
  2. 或使用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!!!"); 
    } 
} 

上面的代碼,我發現所有具有表格標記名的元素,然後查看哪個元素具有標識「:pg」。

這兩個代碼片段基本上都是一樣的,但使用不同的方式(By.id或By.tagname)。但是,使用By.id的代碼的第一部分總是成功,而使用By.tagname的第二部分代碼幾乎總是失敗。 (但它會與額外的等待工作然而)

爲什麼By.id和By.tagname之間的區別?

謝謝, 克里斯。

回答

6

:pg元素最初不在頁面上。使用By.Tag,硒不會等待:pg元素。

因爲By.Id示例更具體,硒將繼續檢查:pg元素是否存在,直到隱式等待(5秒)超時。

By.Tag根本不具體。在findElements(By.tagName("table")上,Selenium將返回頁面加載後立即存在的所有表的數組。由於:pg元素尚未出現,因此它不在數組中。

要回答你的問題,是的,最好使用By.Id,因爲: 1.它更具體。 2.保存代碼行 3.強制硒等待元素存在。

1

根據你的問題,最好使用By.Id

By.tag不用於特定的數據,它實際上會搜索並返回所有具有指定標籤名稱的表的數組,因此使用id您可以獲得適當的輸出。

只有當id ya class沒有被指定,最好的方法是By.cssSelector如果找不到元素,那就去標籤。

謝謝