Удаление children pages в Confluence

Под родительской страницей 50 штук дочерних. Массовое удаление в силу ряда причин недоступно. Если удалить только родительскую страницу, дочерние останутся. Хочется экстерминировать всё семейство, но для этого надо заходить на каждую подстраницу и “убивать” ее персонально.

Название каждой подстраницы уникально, поэтому кликать по ссылке вроде бы затруднительно.

Но нет.

<tr>
    <td>label</td>
    <td>s</td>
    <td></td>
</tr>
<!--open next children page-->
<tr>
    <td>clickAndWait</td>
    <td>//div[@id='page-children' and @class='pageSectionBody children-loaded']/span[@class='child-display']/a</td>
    <td></td>
</tr>
<!--delete page-->
<tr>
    <td>click</td>
    <td>//a[@id='action-menu-link']/span/span</td>
    <td></td>
</tr>
<tr>
    <td>clickAndWait</td>
    <td>css=#action-remove-content-link &gt; span</td>
    <td></td>
</tr>
<tr>
    <td>clickAndWait</td>
    <td>id=confirm</td>
    <td></td>
</tr>
<tr>
    <td>gotolabel</td>
    <td>s</td>
    <td></td>
</tr>

Make it so.

Categories: Мелочи

Вырви историю из гугла

Skype:

— Привет! Ты уже удалил историю своих запросов из Гугла?

— Чего?

— В сша все нехило трекается. Например, я тут страховку для машины искал. Так мне домой стала почта приходить с предложениями. И я стал замечать какие уникальные finger prints собирает мой интернет банкинг. Это удобно отчасти, но неудобно, например, при поиске авиабилетов. Тебе увеличивают стоимость билета если ты часто ищешь. Поэтому я написал extension, который чистит твою google history с http://history.google.com У меня там сейчас 13000 запросов.

— [открыл, глянул, офигел] Нда, у меня там 6119 запросов…

— Дать тебе моего чистильщика?

— Я это и сам могу. [кляц-кляц] Готово. Четыре строчки. Понеслось, история отмирает на моих глазах 🙂

— А почему у тебя аж четыре строки? У меня их только три.

if (document.querySelectorAll(“input[name=del]”))
{ document.querySelector(“span.kd-button”).click();
document.querySelector(“input.kd-button”).click(); }

— Ну, у меня попроще, бесконечный цикл в Selenium IDE:

label | start
click | id=selector_top
clickAndWait | name=btnD
gotolabel | start

Categories: Мелочи

Внезапно вываливающийся список

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

И чтобы вообще огорчить тестировщиков — список этот появляется под полем адреса только при наборе текста, а Selenium IDE такие мансы очень не любит.

Но ведь тестировщики сами могут кого угодно огорчить.

Итак, у нас есть поле ввода с id=billing_full_address, при наборе текста туда должен подтянуться целый список адресов, а затем в выпадающем списке с адресами надо будет кликнуть по тестовому адресу ‘1 Darling Mills Road, ALBION PARK  NSW  2527‘.

01-09-2014 - 17-32-18

Алгоритм:

  • впишем в этом поле начало адреса, который нужно будет получить в списке всех адресов,
  • эмулируем нажатие клавиш (можно даже передавать нажатие определенных клавиш, есть в сети полная таблица кодов),
  • дожидаемся появления ссылки с нужным адресом,
  • кликнем по ссылке с нужным адресом.
type id=billing_full_address 1 Darling island
keyDown id=billing_full_address w
keyPress id=billing_full_address w
keyUp id=billing_full_address w
waitForElementPresent //a[contains(text(),’1 Darling Mills Road, ALBION PARK  NSW  2527′)]  
click //a[contains(text(),’1 Darling Mills Road, ALBION PARK  NSW  2527′)]  

Делов-то…

Moodle > Move down a topic

В Moodle топик надо скинуть в самый низ перечня тем (просто удалить невозможно). Для простоты переименую убиваемую тему в “deleted”.

Прежде всего – определяемая тема должна быть “подсвечена” как “текущая активная” (Highlight this topic as the current topic). Скрипт будет обрабатывать /li[@class=’section main clearfix current’], название темы вообще не имеет значения. Следовательно, тему придется сделать “видимой”, иначе сделать ей подсветку невозможно.

label go
clickAndWait //li[@class=’section main clearfix current’]/div[@class=’right side’]/a[@title=’Move down’]/
gotolabel go

Побегло до финиша. Когда тема окажется в самом низу, кнопка ‘Move down’ окажется нерабочей, скрипт остановится. Дописывать проверку наличия кнопки, и при ее отсутствии переходить к завершению скрипта считаю нецелесообразным.

В общем, скрипт нужно переделать, чтобы привязка происходила непосредственно к теме с определенным названием. Должно получиться что-то вроде //div[@class=’content’]/h3[contains(text(), ‘deleted’)]/../../div[@class=’content’]/../../li[@class=’section main clearfix current’]/div[@class=’right side’]/a[@title=’Move down’]/

Categories: Мелочи Tags:

И давай всех эндорсить

На LinkedIn есть прекрасная возможность тупо эндорсить (слово легко переводимое в приличном обществе, но блин!) всех в своем круге знакомств не глядя, нажатием на кнопку.

А после того, как заэндорсил знакомого, появляется предложение эндорсить (вот ведь слово блядское) сразу четверых знакомых, нажатием на кнопку ‘Endorse all 4″.

endorseThem

Кнопка эта хитрая: обычная команда click по ней не срабатывает.

Срабатывает следующий трюк:

listPagesInTableForSearchExpectedWord
label start
mouseDownAt css=button.btn-action.endorse-all-btn
click css=button.btn-action.endorse-all-btn
pause 1000
gotolabel start

Готово.

Можно эндорсить ВСЕХ своих знакомых, не глядя.

По завершению эндорсирования кнопка исчезнет ВНЕЗАПНО, поэтому стоит озаботиться тем, чтобы скрипт посредством постоянной проверки наличия кнопки завершил свою работу достойно.

Мелочи JavaScript жизни

Как выводить в алерте текст в двух уровнях?

<tr>
 <td>getEval</td>
 <td>alert(unescape('Первый ряд %0AВторой ряд'))</td>
 <td></td>
</tr>

Как сравнить между собой содержимое двух переменных?

Положить текст в две переменные (name1 & name2 в моем случае).
<td>assertEval</td>
<td>'${name1}'=='${name2}'</td>
<td>false</td>
</tr>

В переменную KTO_ZDES пришло какое-то буквенно-числовое значение (предположим, что туда может прийти или слово “Фирма”, или слово “Частное лицо”. Если пришло слово “Фирма”, тогда нужно выкинуть алерт со словом “Фирма”, иначе выкинуть алерт со словом “Частное лицо”.

<tr>
<td>storeEval</td>
<td>if (storedVars [‘KTO_ZDES’] == ‘Фирма’) {‘alertFirma’} else {‘alert4astnoeLitso’}</td>
<td>nextMove</td>
</tr>

Categories: Мелочи, JavaScript

О, хитрая дрянь! Клик по кнопке JQuery

В мире все ещё много дряни. Вот, например, кнопки, реализованные с помощью jQuery: курсором по ней кликать можно, а через Selenium – увы.

Кнопка, расположенная под текстовым полем, представляет из себя нечто вот такое:

<div  class=”judge”>
<button class=”win-button disabled“>
……….<span class=”out”><span class=”button”>Поделиться</span></span>
</button>

После того, как в текстовое поле комментария будет вписан какой-нибудь текст, локатор кнопки изменится:

<div  class=”judge”>
<button class=”win-button“>
……….<span><span>Поделиться</span></span>
</button>

В момент нажатия на кнопку локатор снова меняется:

<div  class=”judge”>
<button class=”win-button pushed“>
……….<span><span>Поделиться</span></span>
</button>

А когда кнопка будет “освобождена”, локатор вообще невообразимо превращается в

<div  class=”judge disabled“></div>

То есть, кнопка вообще исчезает. Коммент сделан, Рубикон брошен на игральный стол (все же знают, что такое кубик Рубикона, не так ли?!)

В общем, не в локаторах проблема. Проблема в том, что Selenium IDE для клика на такие нестандартные кнопки требуется нестандартный подход.

Секрет Дело в том, что эта кнопка реагирует на событие mouseUp и mouseDown.

Рассмотрим работу подобных неурядиц на живом примере: сегодня DOU.ua будет нашей подопытной крыской.

Read more…