Если элемент всегда невидим, делайте через 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();
п.с. у вас такие айдишники огромные, что хпас меньше места займет))
Чтобы перебрать их и найти тот, у которого определенный атрибут имеет конкретное значение, в нашем случае функция возвращает список инпутов у корорых 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… оно будет ексепшен выбивать