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

Помогите сделать sendKeys в элемент, который появляется только после нажатия на кнопку (body.prepend использован)

Теги: #<Tag:0x00007f748a818ea8> #<Tag:0x00007f748a818db8> #<Tag:0x00007f748a818cc8> #<Tag:0x00007f748a818b88>

Проблема заключается в аплоаде файла через такую форму на сайте:
Вот так выглядит кнопка:

<div class="col-sm-10">
              <button type="button" id="button-upload" data-loading-text="Loading..." class="btn btn-primary"><i class="fa fa-upload"></i> Upload</button>
            </div>

Вот скрипт аплоада:

$('#button-upload').on('click', function() {
        $('#form-upload').remove();

        $('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="file" /></form>');

        $('#form-upload input[name=\'file\']').trigger('click');

        if (typeof timer != 'undefined') {
        clearInterval(timer);
        }

        timer = setInterval(function() {
                if ($('#form-upload input[name=\'file\']').val() != '') {
                        clearInterval(timer);

                        // Reset everything
                        $('.alert-dismissible').remove();
                        $('#progress-bar').css('width', '0%');
                        $('#progress-bar').removeClass('progress-bar-danger progress-bar-success');
                        $('#progress-text').html('');

                        $.ajax({
                                url: 'index.php?route=marketplace/installer/upload&user_token=CURRENT_TOKEN',
                                type: 'post',
                                dataType: 'json',
                                data: new FormData($('#form-upload')[0]),
                                cache: false,
                                contentType: false,
                                processData: false,
                                beforeSend: function() {
                                        $('#button-upload').button('loading');
                                },
                                complete: function() {
                                        $('#button-upload').button('reset');
                                },
                                success: function(json) {
                                        if (json['error']) {
                                                $('#progress-bar').addClass('progress-bar-danger');
                                                $('#progress-text').html('<div class="text-danger">' + json['error'] + '</div>');
                                        }
                        
                                        if (json['text']) {
                                                $('#progress-bar').css('width', '20%');
                                                $('#progress-text').html(json['text']);
                                        }
                        
                                        if (json['next']) {
                                                next(json['next'], 1);
                                        }
                                },
                                error: function(xhr, ajaxOptions, thrownError) {
                                        alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
                                }
                        });
                }
        }, 500);
});

Я попытался сделать ‘find_element_by_id(“form-upload”)’ - не находит.
Ищу решение, как загружать файл, прошу помощи.

вставка файла осуществляется отправкой пути до файла в поле input

вот сюда sendKeys(path_to_file)

1 Симпатия

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

это код страницы, как этот элемент выбрать?
он вот в таком виде в браузере отображается, его не могу выбрать…

Это просто кнопка, там еще должен быть элемент, типа input , возможно этот: #form-upload input[name=‘file’]. Этот элемент и надо использовать, используя SendKeys() метод.

вот форма, я не могу ее выбрать…

А зачем его выбирать? Просто, используя метод SendKeys() отправьте ему местоположение файла, который надо загрузить.

)))
как это отправить ему?
я так понял из поисков я сначала делаю селект, потом селектнутомц обьекту отправляю сендки
а как сделать то, что вы озвучили?

получается инпут появляется после клика, как я пнимаю?

Инпут уже есть. Просто невидим для нас. А на странице он есть.

Вроде как jquery после нажатия кнопки только вставляет инпут.
боди.препенд = вставить в начало боди
я думаю в этом и загвоздка - пока не нажмешь кнопку не появляется инпут

Одно из решений в таком случае может быть, используя JS, самому добавить эту форму на страницу сайта.
Как я понимаю, когда вы кликаете на эту форму то открыватся стандартный попап где вы выбираете файл?

Да, системное окно выбора файла. Подскажите как самому добавить? Или где почитать.

сейчас попробовал
‘’’
act = browser.find_element_by_id(‘button-upload’)
act.click()
fileinput = browser.find_element_by_id(‘form-upload’).style.display = “block”
fileinput.send_keys(os.getcwd() + “/file.zip”)

‘’’

пишет:
‘’’
fileinput = browser.find_element_by_id(‘form-upload’).style.display = “block”
Traceback (most recent call last):
File “”, line 1, in
AttributeError: ‘FirefoxWebElement’ object has no attribute ‘style’

fileinput.send_keys(os.getcwd() + “/file.zip”)
Traceback (most recent call last):
File “”, line 1, in
AttributeError: ‘str’ object has no attribute ‘send_keys’
‘’’

Тут показан пример, как можно реализовать выполнение JS скрипта.