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

Selenium.Как отправить sendkeys в hidden поле?

selenium
webdriver
Теги: #<Tag:0x00007f7b643631e8> #<Tag:0x00007f7b643630a8>

#1

Уважаемые пользователи, помогите с проблемкой, уже второй день мучаюсь.
Есть обычные поля ввода, селениум не видит их когда пытаюсь что-то с ними сделать. Вот пример:
driver.findElement(By.id(“dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName”)).sendKeys(“John”);
В ответ на это получаю ElementNotVisibleException
Вот HTML кусок этого блока:

<div class="formfields shippingdetails ">   
        <input type="hidden" name="dwfrm_delivery_shippingOriginalAddress" class="hidden" id="dwfrm_delivery_shippingOriginalAddress" value="false" maxlength="2147483647" data-target="addressTypeShippingOrigin" data-info-type="shipping-address">
        <input type="hidden" name="dwfrm_delivery_shippingSuggestedAddress" class="hidden" id="dwfrm_delivery_shippingSuggestedAddress" value="false" maxlength="2147483647" data-target="addressTypeShippingSuggestion" data-info-type="shipping-address">
    
        <input type="hidden" name="dwfrm_delivery_singleshipping_shippingAddress_isedited" class="hidden is_shipping_changed" id="dwfrm_delivery_singleshipping_shippingAddress_isedited" value="false" maxlength="2147483647">
    
<div class="clearfix address_section_af shipping " data-express-error="false">


<div class="formfield input-half left firstname    ">

            <div class="value">
                
                В ИНПУТ НИЖЕ НУЖНО ВВЕСТИ ТЕКСТ
                    
                    
                    <input class="textinput firstname  required" id="dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName" type="text" name="dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName" value="" maxlength="33" placeholder="* First Name" data-missing-error="Please enter a First name" data-parse-error="Please enter a valid value" data-range-error="Value too long or too short" pattern="^[\u00C0-\u1FFF\u2C00-\uD7FF\u2019a-zA-Z\.\'\-\s]{1,}$" required="required">
                <!-- display text area input field -->
                
                
                    
                       <!-- this MUST be immediately after the input/field tag. Hiden data to be attached to the input field (app.hiddenData in app.js -->

Буду ооооочень благодарен за помощь

Вот еще скриншот проблемного места, а то формитарованый текст криво выглядит


(rmerkushin) #2

Если элемент всегда невидим, делайте через js


#3

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


(rmerkushin) #4

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


#5

Да скрин точно правильный. Но судя по хтмлу в блоке formfields shiping details (самый верхний в выделенном красным) спрятаны всего лишь поля и я так понимаю они не имеют отношения к тому полю что мне надо.


#6

Не подскажешь как сделать этот инпут видимым? или хотя бы вписать туда что-то


(5am) #7

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

удалить атрибут
arguments['элемент].removeAttribute(‘type’)"

изменить значение атрибута
arguments[элемент].setAttribute(arguments[атрибут], arguments[значение])


(2Elf) #8

Как уже писали через джава скрипт.
Я использую питон и делаю так

js_script = '''
    el = document.getElementById("dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName")
    el.value = {here_your_text} '''
js_script.format(here_your_text='Text I want to input')
driver.execute_script(script)

Сам скрипт попробуй выполнить в консоли сначала


#9

Спасибо за ответ но ввод не в это поле а в id=“dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName” type=“text” name=“dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName”
которое находится ниже


#10

Спасибо за ответ, но мне вводить нужно в поле которое находится ниже id=“dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName” type=“text” name=“dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName”

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


(5am) #11

JSный пример, должен отработать для вашего поля


(2Elf) #12
js_script = """
        function getAllElementsWithAttribute(attribute, val)
        {
            var matchingElements = [];
            var allElements = document.getElementsByTagName('input');
            for (var i = 0, n = allElements.length; i < n; i++)
               {
                   if (allElements[i].getAttribute(attribute) == val)
                       {
                           // Element exists with attribute. Add to array.
                           matchingElements.push(allElements[i]);
                       }
              }
       return matchingElements;
       }
el = getAllElementsWithAttribute('placeholder', '* First Name')[0];
el.value = "{my_text}";
"""
js_script.format(my_text="My text")
driver.execute_script(js_script)

Так можно попробовать


(Stan) #13

А зачем искать все инпуты?


#14

Спасибо, попробую в понедельник


(Ренат Исин) #15

А у вас случайно нет еще 1 поля или элемента с таким же ид?
Посмотрите что возвращает isVisible, скорее всего false, посмотрите как парент у этого элемента, или получите его текст/какие либо атрибуты, сравните их с тем, вы видите на странице. Подозреваю, что проблема в том, что селениум у вас подтянул не тот элемент о котором вы думаете.


(Ok Tober) #16

Попробуйте найти елемент и через Actions сделать sendKeys

driver.findElement(By.id("dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName"));
Actions actions = new Actions(driver);
actions;
actions.perform();

ну или если угодно:

new Actions(driver).sendKeys("John").perform();

(Ok Tober) #17

п.с. у вас такие айдишники огромные, что хпас меньше места займет))


(2Elf) #18

Чтобы перебрать их и найти тот, у которого определенный атрибут имеет конкретное значение, в нашем случае функция возвращает список инпутов у корорых placeholder=’* First Name’.


(2Elf) #19

Я бы еще move_to_element и click добавил:

el = driver.findElement(By.id("dwfrm_delivery_singleshipping_shippingAddress_addressFields_firstName"));
new Actions(driver).move_to_element(el).click().sendKeys("John").perform();

(Ok Tober) #20

На счет клика на хидден поле не знаю, но мув ту елемент - да, тогда перед этим не нужно будет искать елемент тот
new Actions(driver).move_to_element(el).sendKeys(“John”).perform();