Robot Framework, расширяющий селен для обработки элемента нагрузки

1

Я использую Robot Framework для автоматизации тестирования и хотел бы знать, есть ли у меня возможность расширить Selenium Webdriver для универсального обращения с элементом загрузки. Для справки, когда я говорю загрузочный элемент, я имею в виду пользовательский элемент "Угловой элемент".

Я понимаю, что могу сделать Wait Until Element Not Visible, но то, что я действительно хочу сделать, это создать постоянный слушатель в Selenium Webdriver, чтобы он останавливался всякий раз, когда этот элемент загрузки виден. Я бы не хотел постоянно использовать ключевое слово robot, чтобы проверить, является ли этот элемент видимым, и быть вынужденным выполнять произвольные сна.

Если мой вопрос до сих пор не ясен, ниже приведено несколько псевдокодов /psuedoflow, о которых я думал. Я предполагаю, что Selenium однопоточный, иначе эта идея была бы бесплодной.

Selenium Webdriver:
       AddListener(new LoadingListener)

       LoadingListener
           While ( LoadingElement is Visible)
             Sleep 1s

Пожалуйста, ответьте на любые отзывы. Если это невозможно, сообщите мне, если у вас есть идеи, дайте мне знать.

Теги:
selenium
automation
frameworks
robotframework

3 ответа

1

Я никогда не делал этого, но вы могли бы использовать интерфейс прослушивателя для вызова функции до или после каждого ключевого слова. Например, слушатель может выглядеть примерно так (непроверенный):

from robot.libraries.BuiltIn import BuiltIn

xpath = //*[@id='loading_element']

class CustomListener(object):
    ROBOT_LISTENER_API_VERSION = 2

    def start_keyword(self, name, attrs):
        selib = BuiltIn().get_library_instance("SeleniumLibrary")
        selib.wait_until_element_is_not_visible(xpath)

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

Для получения дополнительной информации о интерфейсе слушателя см. Раздел " Интерфейс прослушивателя" в Руководстве пользователя Robot Framework.

0

Ниже приведено решение, в результате которого я использовал :) Работал хорошо, спасибо за все комментарии и помощь!

from robot.libraries.BuiltIn import BuiltIn
from datetime import datetime

class LoaderListener(object):
    ROBOT_LISTENER_API_VERSION = 2
    ROBOT_LIBRARY_SCOPE = "GLOBAL"

    def __init__(self):
        self.ROBOT_LIBRARY_LISTENER = self
        self.selib = BuiltIn().get_library_instance("SeleniumLibrary")

    def _start_suite(self, name, attrs):
        BuiltIn().log_to_console("Loader Listener Has Been Attached.")


    def start_keyword(self, name, attrs):
        try:

            # If this doesn't fail we have the loader
            self.selib.find_element("id=loader")

            # Take time stamp for when we begin waiting
            BuiltIn().log_to_console("The Page Is Loading.")
            start_time = datetime.now()

            # Wait Until Element Not Visible
            # Sometimes this will fail, because by the time we get here the loader is gone.
            # In that case, just continue as normal
            try:
                self.selib.wait_until_element_is_not_visible("id=loader") 
            except:
                pass

            # Take time stamp for when we have stopped waiting
            end_time = datetime.now()      

            # Calculate time elapsed
            elapsed_time = (end_time-start_time)

            # Create output message and log to conosle
            output_message = "The Page Has Finished Loading in {0}".format(elapsed_time)
            BuiltIn().log_to_console(output_message)

        except:
            # We don't have the element...
            pass
0

Еще одно направление, которое вы можете предпринять, - использовать ключевое слово SeleniumLibrary Execute Async Javascript.

В документе говорится:

Выполняет асинхронный код JavaScript.

Подобно Execute Javascript, за исключением того, что скрипты, выполняемые с этим ключевым словом, должны явно сигнализировать, что они закончены, вызвав предоставленный обратный вызов. Этот обратный вызов всегда вводится в исполняемую функцию в качестве последнего аргумента.

Скрипты должны заполняться в течение таймаута скрипта или это ключевое слово не будет выполнено

В следующем примере кода из документов:

${result} = Execute Async JavaScript    
... var callback = arguments[arguments.length - 1]; 
... function answer(){callback("text");};   
... window.setTimeout(answer, 2000);    
Should Be Equal ${result}   text

Ещё вопросы

Сообщество Overcoder
Наверх
Меню