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

[Resolved] Помогите определить локатор для элемента списка


(Livira) #1

Здравствуйте,
Просмотрела на форуме похожие топики, попыталась их применить к своему случаю, но все равно фиаско. Нужна помощь знающих)
Автоматизирую с помощью Selenium заполнение длинной анкеты, дохожу на пункта со списком и тест фэйлится, так как не происходит клик (клик по “Город Киев” открывает “Киев”, по которому тоже нужно кликнуть. Не получается клик по “Город Киев”, соответственно и “Киев” не открывается). Помогите определить локатор. Ниже, скрин анкеты и HTML кода, а также локаторы, которые уже пробовала

locators:
//li[3]
css=li:nth-child(2)
//div[@id=‘wiswidget-regihome_API’]/div/div/div/ul/li[3]
//div[//li[text()=‘Город Киев’]]//ul


(Keiga) #2

А по атрибуту wis:data не получается?

CSS:

li[wis:data="8040140000"]

XPath:

//li[@wis:data="8040140000"]

(Sergey Korol) #3

Что-то не совсем логичным для меня выглядит наличие “Город Киев” среди областей. Это так задумано, или же вы предварительно кликаете по одному из элементов списка, чтобы данный пункт отобразился? Я вижу, что выбранный айтем отмаркирован, как selected, что само собой странно для дефолтного состояния списка. Т.е. по всей видимости вы приложили скрин уже выбранного элемента. Но как выглядит весь список с элементами-родителями?

Второе допущение касается самого обработчика клика. Из приведенной верстки не видно, как приложение реагирует на клик по элементам списка. Посему, нужно больше исходников.


(Livira) #4

попробовала, не получилось, не нашло элемент

это действительно не дефолтное состояние, я кликнула на список, чтобы раскрылся список второго уровня.

Реагирует так - сообщением “Необходимо ответить на этот вопрос”. Т.е. никак. Клик не происходит. Причем Selenium не ругается, что не нашел элемент, но самого клика нет (если был бы клик, открылся бы список второго уровня, а он не открывается.


(Livira) #5
/* <div id="wiswidget-regihome_API">
<div class="wiswidget normal" style="cursor: auto;">
<ul class="wis_selection"> </ul>

<div class="wis_select">
<div class="wis_level level_0" wis:level="0" style="max-width: 50%; display: block;">
<ul>
<li class="item" wis:data="8040230000">Винницкая область</li>
<li class="item" wis:data="8040240000">Волынская область</li>
<li class="item" wis:data="8040140000">Город Киев</li>
<li class="item" wis:data="8040060000">Днепропетровская область</li>
...
</ul>
</div>
</div>

<div style="clear: both"></div>
</div>
</div>
*/

(Sergey Korol) #6

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


(Sergey Korol) #7

Эти числа точно не динамически формируются?

И еще вопрос: вы уверены, что ваш кусок кода - это не вершина айсберга? Возможно обработка нажатий происходит по другим элементам?
Сайт есть в паблик доступе?


(Livira) #8
<div class="answerfield">
<input id="ctl-regihome_API" type="hidden" value="" name="regihome_API">
<script src="http://wisapi.wageindicator.org/static/js/wis.js">
<script src="http://wisapi.wageindicator.org/static/3dparty/js/jquery.livesearch.js">
<script>
<div id="wiswidget-regihome_API">
<div class="wiswidget normal" style="cursor: auto;">
<ul class="wis_selection"> </ul>
<div class="wis_select">
<div class="wis_level level_0" wis:level="0" style="max-width: 50%; display: block;">
<ul>
<li class="item" wis:data="8040230000">Винницкая область</li>
<li class="item" wis:data="8040240000">Волынская область</li>
<li class="item selected" wis:data="8040140000">Город Киев</li>
...
</ul>
</div>
<div class="wis_level level_1" wis:level="1" style="max-width: 50%; display: block;">
<ul>
<li class="item leaf" wis:data="8040140107">Киев</li>
<li class="item leaf" wis:data="8040140202">Пригород Киева</li>
</ul>
</div>
</div>
<div style="clear: both"></div>
</div>
</div>
<div class="readonly-value"> </div>
</div>

(Livira) #9

http://mojazarplata.com.ua/ru/main/zarabotok/voprosnik-o-rabote/anketa-dlja-sotrudnikov-kompani
вторая страница анкеты

Огромное спасибо за участие!


(Keiga) #10

Попробуйте такой CSS:

li[wis\:data="8040140000"]

(Sergey Korol) #11

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

П.С. Судя по верстке, там еще и html 5. Т.е. вполне возможно, что будут еще какие-нибудь подводные камни возникать в процессе автоматизации.


(Livira) #12

Буду разбираться.
Попытку “помощь зала” я уже исчерпала, сейчас воспользуюсь “звонком другу”.
Отпишусь о результатах


(Jane Tymoschuk) #14
//li[@*='8040230000']

так должно отработать, по названию атрибута не сработает, потому что содержит двоеточие
если список находится в фрейме, то сначала нужно на него переключиться driver.switchTo().frame(driver.findElement(By.id("content")))


(Livira) #15

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

ЗЫ: я здесь новичок, но радует атмосфера содействия и менторства, а не высокомерия, как на некоторых других ИТ ресурсах)


(Livira) #16

Опять нужна помощь.
Что-то не удается мне поладить с фреймом. Запускаю тест - валится, замирает или не видит элементы. Запускаю тест, раскрываю браузер и скроллингом опускаю окно, вебэлементы как бы на видимости экрана, тест проходит.

@Before
  public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://mojazarplata.com.ua/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

  @Test
  public void testUntitled() throws Exception {
    driver.get(baseUrl + "/ru/main");
    driver.findElement(By.linkText("Анкета для сотрудников компаний")).click();
    driver.switchTo().frame(driver.findElement(By.cssSelector("div.iframe > iframe:nth-child(1)")));
    driver.findElement(By.id("opt-contst71-140")).click();
    driver.findElement(By.id("opt-nrofjobs-1")).click();
    driver.findElement(By.id("opt-controth-0")).click();
    driver.findElement(By.cssSelector("div.navbar.navbottom > input[name=\"next\"]")).click();
    driver.findElement(By.id("opt-sex-1")).click();
    new Select(driver.findElement(By.id("ctl-yybirth"))).selectByVisibleText("1983");
    driver.findElement(By.xpath("//div[@id='wiswidget-regihome_API']/div/div/div/ul/li[3]")).click();
    driver.findElement(By.xpath("//div[@id='wiswidget-regihome_API']/div/div/div[2]/ul/li")).click();
    driver.findElement(By.cssSelector("div.navbar.navbottom > input[name=\"next\"]")).click();
  }

А вот этот фрейм. Я уже вообще начинаю думать, что проще перейти по ссылке в фрейме и там продолжить писать тест. Буду признательна за советы.

<iframe width="100%" height="900" frameborder="0" src="http://ua.websurvey.wageindicator.org/websurvey/Survey?id=wilite-empl&locale=ru_UA" marginheight="0" marginwidth="0" border="0" scrolling="auto" _onload="parent.scrollTo(0,0)">

(Livira) #17

Вопрос снимается, решила с помощью

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();",WebElement)));