Уважаемые пользователи, помогите с проблемкой, уже второй день мучаюсь.
Есть обычные поля ввода, селениум не видит их когда пытаюсь что-то с ними сделать. Вот пример:
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 -->
Буду ооооочень благодарен за помощь
Вот еще скриншот проблемного места, а то формитарованый текст криво выглядит
Я не могу понять что и куда писать т.к у нужного мне елемента нету атрибута hidden, зато у каких-то непонятных полей которые не понятно за что отвечают есть этот атрибут и видимо из за этого селениум не видит его.
ну могу еще предположить что у вас поле должно появляться по какому то евенту или еще что, и оно просто не успевает стать визибл до того как вы к нему обращаетесь. ожидание должно помочь. Ну и еще такой момент, судя по тексту куска html который вы написали, ваше поле является дочерним к элементу который скрыт, если это так, то соответственно все дочерние будут тоже скрыты. хотя со скриншотом есть расхождения. скриншот верный?)
Да скрин точно правильный. Но судя по хтмлу в блоке formfields shiping details (самый верхний в выделенном красным) спрятаны всего лишь поля и я так понимаю они не имеют отношения к тому полю что мне надо.
Спасибо за ответ но ввод не в это поле а в 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_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, посмотрите как парент у этого элемента, или получите его текст/какие либо атрибуты, сравните их с тем, вы видите на странице. Подозреваю, что проблема в том, что селениум у вас подтянул не тот элемент о котором вы думаете.
Чтобы перебрать их и найти тот, у которого определенный атрибут имеет конкретное значение, в нашем случае функция возвращает список инпутов у корорых placeholder=’* First Name’.
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();