Как добавить модуль Python, который использует Sel2Lib, не получая ошибки с несколькими ключевыми словами?

Я пытаюсь импортировать модуль Python, чтобы ездить более 3 часов, но безуспешно. Я выполнил шаги, описанные в четвертом ответе здесь, где предлагается создать модуль Python Selenium2LibraryExt. Как получить весь текст в рамках робота?

проблема, которую я наблюдаю, заключается в том, что, поскольку я использую Selenim2Library в других моих кодах того же теста, теперь я импортирую Selenium2LibraryExt, который наследуется от Selenim2Library, мой тест больше не знает, что, например. Ключевое слово Click Element взято из Selenim2Library или Selenium2LibraryExt, и это дает мне несколько ошибок ключевого слова

Так что я сделал 1-я удалил

       from Selenium2Library import Selenium2Library

из головы моего модуля Python, но я оставил его в качестве библиотеки в моем тестовом примере: настройки

 Library          Selenium2Library  

это не сработало. 2-Тогда я удалил

Library          Selenium2Library  

из моего тестового примера, но добавил:

  from Selenium2Library import Selenium2Library  

в голове моего модуля Python. но в обоих случаях я получаю ошибки. как мне сделать, чтобы мой тест не видел 2 библиотеки selenium2library?

Спасибо


person Michelle    schedule 24.06.2016    source источник
comment
Ваша проблема выглядит примерно так: stackoverflow.com/questions/32230658/   -  person Pekka    schedule 24.06.2016


Ответы (2)


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

Другой вариант — создать библиотеку, расширяющую Selenium2Library, не заменяя ее:

from robot.libraries.BuiltIn import BuiltIn

class Selenium2LibraryExt(object):

    @property
    def _s2l(self):
        return BuiltIn().get_library_instance('Selenium2Library')

    def get_all_texts(self, locator):
        """Returns the text values of elements identified by `locator`."""
        elements = self._s2l._element_find(locator, False, True)
        return [e.text for e in elements]

Если вы используете последнюю версию Selenium2Library (>= 1.7), получите Webelement и Get Webelements позволяет вам делать много вещей, для которых нет ключевого слова...

@{texts}    Create List
@{elems}    Get Webelements    some locator
:FOR    ${elem}    IN    @{elems}
\    ${text}    Get Text    ${elem}
\    Append To List    ${texts}    ${text}

То же самое, но получение текста с использованием расширенного синтаксиса переменных для работы с веб-элемент.

@{texts}    Create List
@{elems}    Get Webelements    some locator
:FOR    ${elem}    IN    @{elems}
\    Append To List    ${texts}    ${elem.text}

Или в Питоне:

from robot.libraries.BuiltIn import BuiltIn

class Selenium2LibraryExt(object):

    def get_all_texts(self, locator):
        """Returns the text values of elements identified by `locator`."""
        s2l = BuiltIn().get_library_instance('Selenium2Library')
        elements = s2l.get_webelements(locator)
        # or elements = BuiltIn().run_keyword('Get Webelements', locator)
        return [e.text for e in elements]

См. также https://stackoverflow.com/a/35323931/2532697.

person ombre42    schedule 24.06.2016
comment
Спасибо, я удалил одну из библиотек selenium2 из своих файлов и поместил свою пользовательскую библиотеку в свой каталог rf. но он все еще показывает мне ту же ошибку. - person Michelle; 27.06.2016
comment
Спасибо, я удалил одну из библиотек selenium2 из своих файлов и поместил свою пользовательскую библиотеку в свой каталог rf. но он все еще показывает мне ту же ошибку. затем я решил использовать get webelement(s), но я просто получил ‹selenium.webdriver.remote.webelement.WebElement (session=36712d97-b0c5-4350-8f47-fcebf7b47f77, element=34)›, который мне бесполезен. Позвольте мне объяснить, что у меня есть несколько заголовков виджетов, которые НЕ находятся в списке, но имеют один и тот же тег html. поэтому я пытаюсь получить все заголовки этих виджетов за один раз. - person Michelle; 27.06.2016
comment
когда я использую вспомогательный плагин xpath и пишу вспомогательный плагин xpath и ${webelement} Get Webelement //div[@class=rqhdrtitle], это приводит ко всем заголовкам. но когда я делаю то же самое в Ride, используя либо ${widgets headers} Get Text //div[@class=rqhdrtitle], либо, как вы сказали, ${webelement} Get Webelement //div[@class=rqhdrtitle], я получаю либо заголовок первого виджета этого ‹selenium.webdriver.remote.webelement.WebElement (session=36712d97-b0c5-4350-8f47-fcebf7b47f77, element=34)›. Есть идеи? пожалуйста? - person Michelle; 27.06.2016
comment
get webelement возвращает только первый элемент. используйте get webelementS. Он возвращает объекты, которые можно использовать вместо локаторов в других ключевых словах (пример добавлен). Также вы можете использовать методы или свойства объекта, как в моем примере. Когда RF преобразует объект в строку, да, вы получаете что-то бесполезное. - person ombre42; 27.06.2016

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

Selenium2LibraryExt.Click Element
person shicky    schedule 24.06.2016
comment
Это не решает проблему пользовательской библиотеки, и Selenium2Library не использует совместное состояние (экземпляры браузера). - person ombre42; 24.06.2016