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

У меня не получилось автоматизировать простой селект(хотя это типо не селект), (см скрин Clip2Net — screen capture tool for Windows, Android, iPad, Mac, Linux ).
Вот так выглядит html:

<table id="SaveModel.Sections_ddListBox" class="dxeButtonEditSys dxeButtonEdit_Metropolis s-textbox dxeReadOnly_Metropolis " style="width:210px;">
<tbody>
<tr>
<td class="dxic" style="width:100%;" onmousedown="return aspxDDDropDown('SaveModel.Sections_ddListBox', event)">
<input id="SaveModel.Sections_ddListBox_I" class="dxeEditArea_Metropolis dxeEditAreaSys " type="text" onchange="aspxETextChanged('SaveModel.Sections_ddListBox')" onblur="aspxELostFocus('SaveModel.Sections_ddListBox')" onfocus="aspxEGotFocus('SaveModel.Sections_ddListBox')" readonly="readonly" name="SaveModel.Sections_ddListBox" autocomplete="off">
</td>
<td id="SaveModel.Sections_ddListBox_B-1" class="dxeButton dxeButtonEditButton_Metropolis" style="-moz-user-select:none;" onmousedown="return aspxDDDropDown('SaveModel.Sections_ddListBox', event)">
<img id="SaveModel.Sections_ddListBox_B-1Img" class="dxEditors_edtDropDown_Metropolis" alt="v" src="/DXR.axd?r=1_15-ErVie">
</td>
</tr>
</tbody>
</table>

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

 protected void selectWithCheckbox(By locator1, By locator2, By locator3) {
    click(locator1); // Кликнул на сам список
    explicitWait(locator2); //Он раскрылся, выбрал один элемент выбрал второй
    click(locator2);
    explicitWait(locator3);
    click(locator3);
}

И если этот единственный в списке действий или последний шаг, то всё норм, но если после него еще что то есть, например поле для ввода телефона надо заполнить, то падает ошибка:

org.openqa.selenium.WebDriverException: 
unknown error: Element <input class="dxeEditArea_Metropolis dxeEditAreaSys " onkeyup="aspxEKeyUp('SaveModel.Phone', event)" id="SaveModel.Phone_I" 
onchange="aspxEValueChanged('SaveModel.Phone')" onblur="aspxELostFocus('SaveModel.Phone')" 
name="SaveModel.Phone" onfocus="aspxEGotFocus('SaveModel.Phone')" 
type="text" onkeypress="aspxEKeyPress('SaveModel.Phone', event)" 
onkeydown="aspxEKeyDown('SaveModel.Phone', event)" autocomplete="off"> is not clickable at point (641, 925).
 Other element would receive the click: <div class="layout-ajax-locker">...</div>
  (Session info: chrome=60.0.3112.113)
  (Driver info: chromedriver=2.32.498550
 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: '3.5.3', revision: 'a88d25fe6b', time: '2017-08-29T12:42:44.417Z'
System info: host: 'C423POP', ip: '169.254.192.90', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_91'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{mobileEmulationEnabled=false, hasTouchScreen=false, platform=XP, 
acceptSslCerts=true, webStorageEnabled=true, browserName=chrome,
 takesScreenshot=true, javascriptEnabled=true, platformName=XP, setWindowRect=true,
 unexpectedAlertBehaviour=, applicationCacheEnabled=false, rotatable=false, 
networkConnectionEnabled=false, chrome={chromedriverVersion=2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a), 
userDataDir=C:\Users\popkov\AppData\Local\Temp\scoped_dir2908_5142},
 takesHeapSnapshot=true, pageLoadStrategy=normal, unhandledPromptBehavior=,
 databaseEnabled=false, handlesAlerts=true, version=60.0.3112.113, browserConnectionEnabled=false, 
nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}]

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

Я добавил в метод со списком еще строчку что бы закрыть его повторным нажатием на то место которым открывал, но всё ровно таже ошибка, только проблема теперь в новой строчке

Версии ОС и софта следующие:
Java
Selenium 3,5
Testng
Тестирую сразу на хроме

Уважаемы коллеги помогите разобраться с этой надоедливой проблемой, автотестами решил заняться недавно, не ожидал что встречу затык в таком месте. Как говорил у меня опыта мало и возможно то что я сделал сплошное дилетантство, подскажите тогда, как лучше такое автоматизировать?

Нормальные вейты надо повставлять
у вас элементы списка не сразу появляются

explicitWait(locator2);

не совсем понятно что он делает

ну и еще интересно как именно выглядят локаторы

By locator1, By locator2, By locator3

1 лайк

Ожидание появления элемента, тут вроде я не накосячил.

  void explicitWait(By locator) {
    WebElement explicitWait = (new WebDriverWait(wd, 10))
            .until(ExpectedConditions.presenceOfElementLocated(locator));
  }

Вот локаторы:

 public void fillCompanyData() throws InterruptedException {
   
    type((By.xpath(".//*[@id='SaveModel.Phone_I']")), "9204445588");

    selectWithCheckbox((By.xpath(".//*[@id='SaveModel.Sections_ddListBox']")), // locator1 
            (By.xpath(".//*[@id='SaveModel.Sections_7_D']")), //locator2
            (By.xpath(".//*[@id='SaveModel.Sections_6_D']"))); //locator3
    type((By.xpath(".//*[@id='SaveModel.Phone_I']")), "9204445588");
  }
}

Вот скрин Clip2Net — screen capture tool for Windows, Android, iPad, Mac, Linux

Но они вроде вроде находятся

Ну он может и находится, но видимый ли он или нет? Я бы сначала нажал на этот селект, а потом отыскал бы чекбоксы и нажимал бы их по названию категорий, полагаю что там будет поиск через родителя, который хорошо реализуется через xpath

1 лайк

Я вроде бы понял вас, но к сожалению у меня пока плохо с xpath, все беру в основном через firepath.
И сам метод с выбором чекбоксов в селекте вроде как работает, ломаться начинает все что следует за ним(а это, по сценарию, должно быть либо поле ввода либо другой селект), его б, конечно, что бы не связываться можно было бы оставить последним, но в форме еще несколько обязательных селектов.

Этот кондишн ждет появления элемента в дом дереве. У вас он уже там есть, потому и не срабатывает.
Вам нужно ждать другого, например elementToBeClickable() или что-то в этом роде.

1 лайк

Большое спасибо за совет! elementToBeClickable() - не знал что так можно, крутая штука)
Вроде бы работает, странно что когда я только внес изменения он упал по той же причине, а сейчас перезапускал сто раз, включал/выключал иде и не падает, надеюсь он обрел стабильность)

Их много, вот тут можно почитать про вейты:
http://selenium-python.readthedocs.io/waits.html

1 лайк