Selenium webdriver request вопрос на тыщу рублей

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sadmz, 10 Dec 2017.

  1. sadmz

    sadmz New Member

    Joined:
    19 Nov 2007
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    В общем по факту меня интересует аплод фотографии на https://m.ok.ru/dk?st.cmd=userAddPhoto&st.msel=on&_prevCmd=userAllPhotos

    JS выключил

    парсим и получаем вот такие POST DATA
    [​IMG]

    Как видим по мимо самого файла, там передается ещё 2 переменные

    fr.posted=set и button_load=Загрузить фото

    Вот собственно сами элементы страницы [​IMG]

    Ну и вопрос, как это всё всё передать с помощью requests


    response = driver.request('POST', URL, headers=headers, data=data, files=files)

    Так как files передает только одну переменную, то есть сам файл, другие переменные он просто не видит.

    За совет тыщу рублей) спасибо.
     
  2. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Code:
    form_data = {'field1':'value1','field2':'value2'}
    driver.request('POST', URL, headers=headers, data=form_data, files=files)
    
    ?
     
  3. sadmz

    sadmz New Member

    Joined:
    19 Nov 2007
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    Нет, это же QUERY STRING ну то есть другой тип передачи данных. Согласен, похоже как будто переменные из той колонки, но передаются они как мультипарт дата. Довольно странно.
     
  4. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Не понял.
    Я говорил про метод POST и передачу данных (как будто из полей формы) в качестве аргумета метода request.
    RTFM тут
    upd.
    Аналогичный вопрос тут.
    Все input`ы с типом hidden надо запихнуть в payload (я назвал словарь form_data)


    Может быть я неверно понял вопрос?
    А при отключенном JavaScript, Selenium не парсит DOM-дерево? (то есть невозможно получить доступ через метод по поиску по id ?
     
    #4 r0, 10 Dec 2017
    Last edited: 10 Dec 2017
  5. sadmz

    sadmz New Member

    Joined:
    19 Nov 2007
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    Если передать их в data, то получится немного другой тип данных. Тут эти переменные передаются как будто часть файла (мультипарт дата). Может я конечно что-то не понимаю, но на парсинге это выглядит именно так.

    При отключенном JS делал скрин. Всё нормально ищется.
     
  6. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Хорошо, тогда вроде как всё без изменений (извращение конечно, но надо пробовать):
    Code:
    POST a Multipart-Encoded File
    Requests makes it simple to upload Multipart-encoded files:
    url = 'http://httpbin.org/post'
    files = {'file': open('report.xls', 'rb'), 'key1': 'value1', 'key2' : 'value2'}
    r = requests.post(url, files=files)
    
    Может попробовать сделать:
    Code:
    driver.find_element_by_id("field_file").send_keys(os.getcwd()+"/image.png")
    submit = driver.find_element_by_id("upload_photo_btn")
    submit.click()
    Или тут уже как раз (для клика) и нужен отключенный JS ?
     
  7. sadmz

    sadmz New Member

    Joined:
    19 Nov 2007
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0

    Да нет, когда передаешь в files какие-то другие переменные, не содержащие сам файл, их видимо сам модуль requests отсекает.
    При том, в сам files можно передавать бесчисленное множество файлов, в одном запросе.

    Что касается кликнуть, там же откроется файловый менеджер, которым управлять не получается. Нативно к нему доступа нет. В Firefox 17.0 ещё как-то было реализовано, но в других версиях уже нет.

    Так-с, ну с переменными я разобрался.
    Code:
    files = {'fr.posted': (None, 'set'), 'fr.file': ('1.png', open('1.png', 'rb')), 'button_load': (None, 'Загрузить фото')}
    Да, таким методом всё работает. По всей видимости для переменных которые передаются в мутильтипарт для модуля requests нужно указывать отсутствующий тип данных.
     
    #7 sadmz, 10 Dec 2017
    Last edited: 11 Dec 2017