Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как при про помощи Selenium+Webdriver+Java нажать на кнопку у которой динамический локатор :?


(Anton Karabeinikov) #1

Вот код :
button class=“user-actions-follow-button js-follow-btn follow-button btn small small-follow-btn” type=“button”>
span class=“button-text follow-text”>
span class=“button-text following-text”> Following /span>
span class=“button-text unfollow-text”> Unfollow /span>
span class=“button-text blocked-text”>Blocked/span>
span class=“button-text unblock-text”>Unblock/span>
span class=“button-text pending-text”>Pending/span>
span class=“button-text cancel-text”>Cancel/span>
/button>

Такие кнопки появляются по мере прокручивания страницы…как мне нажать на них? Так как ID and XPATH каждый раз меняется


(Alex Shats) #2

Вам нужно нажать на эти кнопки размещенные рядом с опредленным постом?
Что именно тут динамически лично я не понял. То что этих кнопок изначально нет на странице?
С помощью XPATH вы можете добраться фактически до любого элемента на странице. Скажем взять за “якорь” какой то текст, и от него уже искать дальше.
XPATH очень мощная штука.


(Jane Tymoschuk) #3

да, интересно, какая именно часть динамична? классы я вижу достаточно удобными
если кнопок нет и они повяляются в одном экземпляре, то не вижу проблемы ждать их By.class
если они есть и они повторяются для каждого идентичного блока, то имеет смысл искать сначала блок по xpath или чему-то еще, а внутри блока опять таки по классу:

driver.findElement(By.xpath("article xpath")).findElement(By.class("unblock-text"))

например так


(Anton Karabeinikov) #4

Я пробовал так
getDriver().findElement(By.xpath(".//span[@class=‘button-text following-text’]")).click();
Но свалился на этом тест . Там просто кнопок “Following” много… какую именно оно должно было нажать и как нажать их все по очереди и проверить что они нажатые то есть тогда они “Unfollow” становятся.

А по этому
driver.findElement(By.xpath(“article xpath”)).findElement(By.class(“unblock-text”))

Я не совсем понял что оно должно делать …можно чуток подробнее ? )


(Anton Karabeinikov) #5

Ну тут появляются по три такие окошка с пользователями …и в каждом из этих окошек есть кнопка “Follow”. B каждый раз пользователи меняются и XPATH этих кнопок тоже. Я не так силён в этом что б в ручную писать XPATH да и этих пользователей может быть 500 шт…как тогда их всех нажимать по очереди ?


(Руслан) #6

я так понял, что тут , ты тут поиск внутри поиска))

ищешь блок по

By.xpath("article xpath")

потом внутри этого блока ищешь нужны элемент

findElement(By.class("unblock-text")

(Anton Karabeinikov) #7

Эх…а вот если бы я ещё понял ))…как оно вообще должно выглядеть ?


(Руслан) #8

смотри,

у тебя есть блок, в котором находится динамический локатор.

Ты показываешь драйверу, что нужно именно в этом блоке найти

http://awesomescreenshot.com/0b73hj8q10

тут в блоке есть кнопки “Поиск в гугле”


(Anton Karabeinikov) #9

а как искать блок ?..
driver.findElement(By.xpath(“article xpath”)).findElement(By.class(“unblock-text”))

что значит “article xpath”?


(Руслан) #10

не знаю, что в данном случае имелось под “article xpath”
но…через консоль браузера сделать инспект нужного элемента, посмотреть внутри чего он находится


(Anton Karabeinikov) #11

http://snag.gy/d8DXr.jpg вот собственно инспект)… как в этом случае быть ? )


(Руслан) #12

Сделай инспект всего квадрата, где ".Rosy"и эта кнопка
и внутри этого квадрата(блока) ищи кнопку


(vmaximv) #13

Вы в твитере автоматизатором работаете, или так - ботов пишете -_-?


(Jane Tymoschuk) #14

xpath блока (aritcle xpath - у меня это обычно для статей таке использовалось, поэтому привычка)))

By user_block = By.xpath("//*[@data-test-selector='ProfileTimelineUser']");
By follow_button =  By.class("user-actions-follow-button");

если хотите нажать читать для всех пользователей, которые доступны на странице:

for(WebElement user: driver. findElements(user_block)){
    user.findElement(follow_button).click();
    // wait something
}

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

это пример. реальную задачу не вижу, так что вот

дальше можно бесконечно говорить о до проверках:
в локаторе можно учесть только те блоки, которые содержат данную кнопку
либо в цикле проверять, что клик должен производиться, если user.findElements(follow_button).size()>0
либо ждать пока такой элемент появится, если он должен быть всегда
да ну много всего


(Anton Karabeinikov) #15

Дальше я ничё не понял=)… но чуть подкорректировал и вроде “О,чудо!” тест прошёл…хотя я ещё не понял как проверить мне на во второй строке By,className написал …но у двух чел что у меня были оно нажало… незнаю как будет если будет много …оно только видимые нажимает …и типа ещё нужно между этим скролл как-то добавить ?!


(Anton Karabeinikov) #16

И ещё такой вопросик можно ли что б оно нажимало “Follows” но при этом что б оно не нажимало “Unfollow”… и можно ли проверку какую-то поставить на то что б оно смотрело какое нажатое то не нажимать… или я много хочу… ?! )


(Sergey Korol) #17

Автору первое предупреждение за создание дубликатов тем. Внимательно читаем FAQ. Создаваемый контент должен быть информативен. Если вас не поняли с первого раза, это не значит, что нужно создавать копии с разными саммари. Предыдущая тема будет вечером удалена.


(Jane Tymoschuk) #18

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


(Alexander Petrovich) #19

А в чём проблема, собственно? Циклом for, например :slight_smile:


(Anton Karabeinikov) #20

А подскажите подробнее…я ещё так сказать зелёный.Как бы это выглядело.И как привязываться к элементам?!таких кнопочек много просто