Является ли by.id лучше, чем by.tagname? - PullRequest
2 голосов
/ 16 июня 2011

Я работал над чтением писем из gmail с помощью веб-драйвера, и между ними я обнаружил разницу между By.id и By.tagname.

Я пытаюсь получить доступ к "таблице" с идентификатором ": pg".Поэтому я могу

  1. Либо использовать By.id (": pg")
  2. ИЛИ использовать By.tagname ("таблица") и искать элемент с идентификатором: 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"));`

Над кодом я непосредственно получаю элемент с идентификатором ": 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 и затем вижу, какой из них имеет идентификатор ": pg".

Обаэти фрагменты кода по сути делают то же самое, но используют разные способы (By.id или By.tagname).Однако первый фрагмент кода, который использует By.id, всегда завершается успешно, в то время как второй фрагмент кода, который использует By.tagname, почти всегда завершается неудачей.(Это будет работать с дополнительным ожиданием, однако)

Почему эта разница между By.id и By.tagname?

Спасибо, Крис.

Ответы [ 2 ]

6 голосов
/ 20 июля 2011

Элемент :pg изначально отсутствует на странице.

При использовании By.Tag селен не будет ожидать элемента :pg.

Поскольку пример By.Id является более конкретным, селен будет продолжать проверять, существует ли элемент :pg до истечения времени неявного ожидания (5 секунд).

By.Tag вообще не является конкретным.На findElements(By.tagName("table") Selenium вернет массив всех таблиц, которые присутствуют сразу после загрузки страницы.Поскольку элемент :pg пока отсутствует, он не будет в массиве.

Чтобы ответить на ваш вопрос, да, лучше использовать By.Id, потому что: 1. Он более конкретен.2. Сохраняет строки кода 3. Заставляет селен ждать, пока элемент будет существовать.

1 голос
/ 19 января 2013

Лучше использовать By.Id в соответствии с вашим вопросом.

By.tag не используется для конкретных данных, он фактически будет искать и возвращать массив всех таблицс указанным именем тега, поэтому используя идентификатор, вы можете получить соответствующий вывод на данный момент.

Перейти к тегу, только если идентификатор класса не указан, и лучший способ может быть By.cssSelector , еслиэлемент не найден.

Спасибо

...