t.me/atinfo_chat Telegram группа по автоматизации тестирования

Запомнить текст кнопок в переменной списка

robot-framework
selenium
Теги: #<Tag:0x00007f21d36a7538> #<Tag:0x00007f21d36a73d0>

(Роман Клочков) #1

В целом задача была проверить, что в определённом столбце есть ячейка с нужным текстом.
Но таблица вся навороченная динамическая, в каждом столбце и сортировка и фильтры с AND/OR и я попытался сначала решить задачу попроще, извлечь список из более понятной структуры, взяв простой набор кнопок

<nav class="navbar navbar-default menu ng-scope" role="navigation" data-ng-controller="Upss.MainMenuController as menu">
	<div class="container-fluid">
		<ul class="nav navbar-nav">
			<li data-ng-class="menu.getClass('bla-bla')">
				<a href="#/hydro-energy-parameters/invalid-plant-parameters" class="menu-item animated">НОЛЬ</a>
			</li>
			<li data-ng-class="menu.getClass('reference-information')" class="active">
				<a href="#/reference-information" class="menu-item animated">РАЗ</a>
			</li>
			<li data-ng-class="menu.getClass('instructions')">
				<a href="#/instructions" class="menu-item animated">ДВА</a>
			</li>
			<li data-ng-class="menu.getClass('reports')">
				<a href="#/reports" class="menu-item animated">ТРИ</a>
			</li>
			<li data-ng-class="menu.getClass('metrics')">
				<a href="#/metrics-search" class="menu-item animated">ЧЕТЫРЕ</a>
			</li>
			<li data-ng-class="menu.getClass('hydro-meteo')">
				<a href="#/hydro-meteo/bulletin" class="menu-item animated">ПЯТЬ</a>
			</li>			
			<li data-ng-class="menu.getClass('user-help')">
				<a href="/content/help/userguide_02.0.10.pdf" target="_blank" title="Руководство пользователя">
					<i class="ctrl-sprite ctrl-question-min"></i>
				</a>
			</li>
			
		</ul>
	</div>
</nav>

Если написать в RF так -

*** Test Case ***
test_List
 |   Open Browser          |    XXXXXXX         |    chrome
 |   Wait Until Element Is Visible                   |    xpath=//div/ul/li
 |   ${var} =                    |    Get Text             |   xpath=//div/ul/li/a[contains(text(),*)]
 |   log to console          |    Find - ${var} !!

Всё ок, получается найти текст первой кнопки и положить в переменную
Как только начинаю пытаться собрать текст всех кнопок, типа

 |    @{var} =                |     Get Text            |    xpath=//div/ul/li/following-sibling::text()

начинается
InvalidSelectorException: Message: invalid selector: The result of the xpath expression “//div/ul/li/following-sibling::text()” is: [object Text]. It should be an element.
и прочий треш…
Почему ожидается элемент - не могу понять

Помогите пожалуйста сложить в список названия шести кнопок.
Ну и если кто поделится опытом работы с ячейками динамической таблицы, вообще здорово - никаких материалов/примеров по работе с ними не нашёл.


(Виталий Задорожный) #2

Привет, попробуй так
@{element_list}= get webelements xpath=//
${result}= Create List
:FOR ${elem} in @{element_list}
\ ${button_name}= Get Text ${elem}
\ Append To List ${result} ${button_name}


(Роман Клочков) #3

Привет Виталий, спасибо за идею!


в @{element_list} всё складывается, там много элементов
но цикл неживой, ругается на “FOR loop contains no keywords”
почитал доку по BuiltIt, судя по всему в RF циклы не работают если нет ниодного “IF”
но тупо вставить “Continue For Loop If ${i}<5” и делать i++ не помогло.


(Виталий Задорожный) #4

У меня работает


1


(Роман Клочков) #5

чудеса (
может у тебя библиотеки подключены дополнительные?
у меня win10, Python 3.7.3 плюс что RF+selenium подтянули:
23.05.2019 22:55 601 424 robotframework-3.1.1-py2.py3-none-any.whl
23.05.2019 22:55 81 756 robotframework_seleniumlibrary-3.3.1-py2.py3-none-any.whl
23.05.2019 22:55 904 577 selenium-3.141.0-py2.py3-none-any.whl
23.05.2019 22:55 150 799 urllib3-1.25.2-py2.py3-none-any.whl

И кстати, если я обратный слеш ставлю как на рисунке в твоём коде, получаю
No keyword with name ‘Append To List’ found.”
ну и на всякий случай, в @{element_list} у меня записи типа
<selenium.webdriver.remote.webelement.WebElement (session=“08bbad72f9aa42d4dfe9ae65557a20aa”, element=“0.19203719374746453-1”)>


(Виталий Задорожный) #6

Так и должно быть, для этого и используется Get Text.


(Виталий Задорожный) #7

Таки да, устанавливай AppiumLibrary
-> keywords -> _element.py
Метод get_text оттуда.


(Роман Клочков) #8

Спасибо, но апнуть питон только завтра смогу, так что быстро не проверю.
Но тогда другой вопрос. Seleniumlibrary и Appium пересекаются по многим кейвордам - их можно в одном сьюте подключать?


(Виталий Задорожный) #9

Да, pycharm упорно отправляет меня на Appium либу, видимо отправляет на первый найденый.
get_text юзается все-таки из selenium либы, больше гипотез почему у тебя не работает пока нет(


(Роман Клочков) #10

Спасибо Виталий, всё заработало!
Appium отключил, оказалось дело не в нём. Проблема оказалась в

И кстати, если я обратный слеш ставлю как на рисунке в твоём коде, получаю
No keyword with name ‘Append To List’ found .”

Я впервые столкнулся с многострочным операторов в RF и не знал, что надо все кейворды внутри него отмечать обратным слешом. в описаниях библиотек это не указано, нашёл только в User Guide
Ошибка выше исправилась после подключения библиотеки “Collections”
Кстати, у меня никакой “гонки библиотек” за одинаковые кейворды нет. Как только подключил Appium, сразу получил

Multiple keywords with name 'Wait Until Element Is Visible' found. Give the full name of the keyword you want to use:
    AppiumLibrary.Wait Until Element Is Visible
    SeleniumLibrary.Wait Until Element Is Visible