0

私のプロジェクトでは、Web システムのテストに Robot Framework と Selenium2Library を使用しています。

css ロケーターで見つかった要素のリストから特定の要素を使用する必要があります。たとえば、.innerTable>tbody>tr>tdは 10 個の要素を検索し、それらの要素の 2 番目の要素が必要になります。以前のプロジェクトでは、次のようにして目的の要素を参照できました。

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

つまり、要素のリストを作成し、インデックスを使用して特定の要素を選択できます。しかし、Robot フレームワーク + Selenium2Library で同様のことができるかどうかは誰にもわかりませんか?


Selenium2Library キーワードのみを使用して結果に到達する方法があるかどうかを理解しようとしていました。明らかに、既存のキーワードでは不可能です。

ロケーターによって識別された多くの要素から 1 つの特定の要素を使用する可能性を実装するには (元の質問では、それらは css セレクターによって検出されたテーブル セルでした)、Selenium2Library ライブラリに移動して、そこで新しいメソッドを作成する必要があります。

C:\Python27\Lib\site-packages\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

これにより、Web 要素オブジェクトのリストが返され、このリストを使用して特定の要素を指摘し、それに対して何らかのアクションを実行できます。ただし、クリック、テキストの取得、入力などのアクションが必要な場合は、同じクラスに追加のメソッドを作成する必要があります。これは最適な方法とは思えませんが、少なくとも機能します。もう 1 つのオプションは xpath を使用することであり、上記の記述について心配する必要はありませんが、多数の同様の要素を含む巨大なページをイメージし、ここで Internet Explorer を使用する要件を追加すると、xpath は避けたいものになる可能性があります。

4

2 に答える 2

2

多くの兄弟が先行する要素を見つけていない場合は、隣接する兄弟セレクターを使用できます。たとえば、次のロケーターは、順序付きリストの 2 番目の項目を選択します。

css= ol > li:first-child + li

作成を検討するキーワードの 1 つは、Assign Id To Nth Element です。指定されたロケーターを使用して返された要素コレクションの N 番目の要素に ID が割り当てられることを除いて、Assign Id To Element と同じです。これにより、 Selenium2Library を変更せずに他のキーワードを使用できるようになります。例えば:

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

これにより、多くの兄弟が先行する子供を簡単に選択できるようになります。隣接する兄弟セレクターでは、nth-child が CSS3 まで使用できないため、そのシナリオではセレクターが巨大になります。

以下は、Assign Id To Nth Element の実装です。

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])
于 2013-07-15T17:31:53.870 に答える