Я использую 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
Пожалуйста, ответьте на любые отзывы. Если это невозможно, сообщите мне, если у вас есть идеи, дайте мне знать.
Я никогда не делал этого, но вы могли бы использовать интерфейс прослушивателя для вызова функции до или после каждого ключевого слова. Например, слушатель может выглядеть примерно так (непроверенный):
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.
Ниже приведено решение, в результате которого я использовал :) Работал хорошо, спасибо за все комментарии и помощь!
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
Еще одно направление, которое вы можете предпринять, - использовать ключевое слово 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