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

Ошибка SeleniumWebDriver при работе с input

locators
selenium
python
webdriver
Теги: #<Tag:0x00007f9e3c33c728> #<Tag:0x00007f9e3c33c480> #<Tag:0x00007f9e3c33c318> #<Tag:0x00007f9e42e27f38>

(Alexandr Panchenko) #1

На странице импут, выглядящий вполне стандартно:

<th>
<div class="row-fluid">
<input type="text" name="createdtime" class="listSearchContributor inputElement dateField" 
data-date-format="mm-dd-yyyy" data-calendar-type="range" value="" 
data-fieldinfo="{'mandatory':false,'presence':true,'quickcreate':false,
'masseditable':false,'defaultvalue':false,'column':'createdtime','type':'datetime',
'name':'createdtime','label':'Created Time','date-format':'mm-dd-yyyy','validator':[]}" 
data-field-type="datetime">
</div>
<input type="hidden" class="operatorValue" value="">	
</th>

Если просто браузером в мануалке открыть и печатать туда значения, напр.
“09-24-2019,09-24-2019” - то всё прекрасно вводится с клавиатуры и происходит поиск.

Код для передачи значения:

    xpath = ''
    
    path_dic = {
        "Created Time"   : '//input[@name="createdtime"]',
    }
  
    if fname in  path_dic:
        xpath = path_dic[fname]

    if xpath !='' and link_txt is None:
        link = xp(context, xpath)
        link_txt = link.get_attribute('placeholder')
        if link_txt is None or link_txt == "": 
            link_txt = link.get_attribute('data-fieldinfo')
            try:
                link_txt = json.loads(link_txt)['label']
            except:
                pass

            if link is not None and link_txt is None: link_txt = fname

    into = fname.lower().find(link_txt.lower())
    if into == -1:
        into = link_txt.lower().find(fname.lower())
    assert into!=-1, 'field ' + fname + ' not found. Text '+link_txt
    link.clear()
    link.send_keys(fval)

Логи и ошибка вот такая:

File "d:\onedrive\current_job\_test\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "d:\onedrive\current_job\_test\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
  (Session info: chrome=77.0.3865.90)
  (Driver info: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 10.0.18362 x86_64)

Подскажите, почему я получаю ошибку?
Может есть путь “нестандартного” ввода в инпут???
Короче, благодарен за любую помощь.


(Vladislav Abramov) #2

повесьте вейтер на то, чтоб элемент стал видимым, а потом вводите данные


(Alexandr Panchenko) #3

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


(Vladislav Sobol) #4

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


(Vladislav Abramov) #5

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


(Viktor) #6

У вас там 2 инпута, сначала кликните по верхнему, а потом введите во второе, которое до момента клика hidden

<input type="hidden" class="operatorValue" value="">

(Alexandr Panchenko) #7

Там вводить надо не в хайд-поле, во всяком случае на других импутах всё работает…
Сейчас я сделал:

print('after assert')
    link.click
    
    if fval == "[NULL]": return None
    try:
        link.clear()
    except:
        print('except clear')
    try:
        link.send_keys(fval)
    except:
        print('except send_keys')
        ac = ActionChains(context.browser)
        ac.move_to_element(link).send_keys(fval).perform()

Вывод в консоль на этом поле:
after assert
except clear
except send_keys
На другх - ексепты не сыпит, причем
link.click
т.е. клик в этом инпут-поле - срабатывает нормально
ActionChains тоже не шлёт ничего.
Не поле а загадка прям какая-то


(Alexandr Panchenko) #8

добавил проверку

link = xp(context, xpath)
        assert link is not None, f'field "{fname}" not found.'

проверка не срабатывает, т.е. по х-пазу Селениум что-то находит
добавил

    try:
        link.click()
    except:
        print('except click')

теперь и на клик пишет ексепт


(Vladislav Sobol) #9

Конечно находит, у вас же в первом посте еть эррор лог, который говорит
Message: element not interactable - т.е. он есть но не кликабелен. Добавте как писали выше ожидание Visibility или elementToBeClickable, иои попросту поспите секунд 10 перед кликом чтобы уж точно дождаться и будете знать может по этому локатору еще есть элемент помимо вашей формы.


(Alexandr Panchenko) #10

Короче, переделал под это конкретное поле кусок кода так:

def ac_sk(obj, fval):
        ac = ActionChains(context.browser)
        ac.move_to_element(obj).perform()
        ac.send_keys(fval).perform()

    if xpath !='' and link_txt is None:
        link = xp(context, xpath)
        if fname in ["Created Time"] :
            ac_sk(link,fval)
        assert link is not None, f'field "{fname}" not found.'

Заработало.
Ну не чудо, а?