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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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

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

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)

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

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

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

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

Попробуйте найти елемент и через 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();
1 лайк

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

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

Я бы еще 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();

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

Так оно елемента самого не видит, в месте driver.findElement… оно будет ексепшен выбивать