2013-07-01 5 views
0

В моем проекте используются Robot Framework и Selenium2Library для тестирования веб-системы.Как обратиться к определенному элементу из списка, найденного css locator

Мне нужно использовать определенный элемент из списка элементов, найденных css-локатором. Например, .innerTable> tbody> tr> td найдет 10 элементов, и мне понадобится второй элемент из них. В моем предыдущем проекте я мог бы сделать следующее, чтобы обратиться к нужному элементу:

specific_cell = driver.find_elements(By.CSS_SELECTOR, ".innerTable>tbody>tr>td")[1] 

Это означает, что он создает список элементов и с помощью индекса можно выбрать конкретный один. Но кто-нибудь знает, могу ли я сделать что-то подобное с Robot framework + Selenium2Library?


Я пытался понять, есть ли способ достичь результата, используя только ключевые слова Selenium2Library. По-видимому, это невозможно с существующими ключевыми словами.

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

В C: \ python27 \ Lib \ сайт-пакеты \ Selenium2Library \ keywords_element.py один может добавить такой метод

def return_elements(self, locator): 
    """Returns a list of elements identified by a given locator. 
    """ 
    elements = self._element_find(locator, False, True) 
    if elements is None: 
     raise AssertionError("Could not find element(s) '%s'" % (locator)) 
    return elements 

Это будет возвращать список веб-элементов объектов, и этот список может быть использован для укажите конкретный элемент и затем выполните некоторые действия по этому вопросу. Но если вам нужны такие действия, как щелчок, получить текст или тип, тогда в одном классе должны быть созданы дополнительные методы. Ну, это не выглядит оптимальным, но, по крайней мере, это делает работу. Другой вариант - использовать xpath и не беспокоиться об этом выше, но как только вы создаете огромные страницы с большим количеством похожих элементов и добавляете здесь требование использовать Internet Explorer, тогда xpath может быть чем-то, чего вы хотите избежать

+0

Селен 2 * есть * WebDriver. Вы должны иметь возможность получить этот элемент, используя этот точный фрагмент кода. Что вы пробовали? – Droogans

ответ

0

Я всегда рекомендую не схватив один крошечный элемент и давая ему имя. Создайте большее количество элементов, и пусть те, кто использует ваш элемент, определяют, что они хотят.

class TablePage(object): 
    """A page with a table on it.""" 

    def __init__(self):    
     # I would call super() on the `BasePage` here. 
     pass 

    @property 
    def table_element(self): 
     # factored out: '.innerTable td' 
     css = '.innerTable > tbody > tr > td' 
     return self.driver.find_elements(By.CSS_SELECTOR, css) 

    def find_in_table_element(self, table_text): 
     for entry in self.table_element: 
      # you may want case-sensitive here 
      if entry.text.lower == table_text.lower 
      return entry 
     return [] # or None... 

Вы можете использовать его немного более жидко здесь, опираясь на код приложения, чтобы сделать фактическую работу, и мы надеемся, что приводит к уменьшению обслуживания для вас. Веб-страницы постоянно меняются!

Вы могли бы реализовать это следующим образом:

page_with_table = TablePage() 
second_entry = page_with_table.table_element[1] 
table_entry_by_text = page_with_table.find_in_table_element('specific text') 
assertEquals(second_entry.text, table_entry_by_text.text) # or whatever 
1

Если вы не местонахождение элемент, который предшествует много братьев и сестер, вы можете использовать соседние братские селекторы. Например, следующий локатор выбирает второй пункт в упорядоченном списке:

css= ol > li:first-child + li 

Одно ключевое слово вы можете рассмотреть вопрос о создании будет Присвоить идентификатор элемента N-й. Это будет то же самое, что и Assign Id To Element, за исключением того, что идентификатор присваивается элементу, который является Nth в коллекции элементов, возвращаемым с использованием данного локатора. Это позволит вам использовать другие ключевые слова без Изменение Selenium2Library. Например:

Assign Id To Nth Element css= ol > li 27th_item 27 
Element Text Should Be id= 27th_item some text 

Это сделает выбор ребенка предшествуют многих братьев и сестер легче. С соседними селекторами селектора селектор будет огромным в этом сценарии, потому что nth-child недоступен до CSS3.

Вот реализация Присвоить идентификатор элемента N-й:

from robot.libraries.BuiltIn import BuiltIn 


class S2LExt(object): 

    def assign_id_to_nth_element(self, locator, id, n): 
     """Assigns a temporary identifier to the Nth element found. 

     This is mainly useful if the locator is complicated/slow XPath expression. 
     Identifier expires when the page is reloaded. `n` is 1-based index of the 
     element in the set found with the given `locator` to assign an ID to. 

     Example: 
     | Assign ID to Nth Element | xpath=//div[@id="first_div"] | my id | 5 | 
     | Page Should Contain Element | my id | 
     """ 
     lib = BuiltIn().get_library_instance('Selenium2Library') 
     n = int(n) 
     elements = lib._element_find(locator, False, True) 
     if len(elements) < n: 
      raise IndexError("Only %d elements found using locator '%s'." % (len(elements), locator)) 
     lib._info("Assigning temporary id '%s' to element '%s'" % (id, locator)) 
     lib._current_browser().execute_script("arguments[0].id = '%s';" % id, elements[n-1]) 
Смежные вопросы