Функция веб-клиента Powershell упрощена, чтобы я мог легко публиковать данные формы.

Я использовал сценарий автоматизации Internet Explorer, который можно найти здесь: http://www.pvle.be/2009/06/web-ui-automationtest-using-powershell/

Это позволяет мне легко публиковать данные формы с помощью таких команд (функций):

NavigateTo "http://www.websiteURI/"
SetElementValueByName "q" "powershell variable scope"
SetElementValueByName "num" "30"
SetElementValueByName "lr" "lang_en"
ClickElementById "sb_form_go"

Вышеупомянутое позволит мне отправлять значения элементам и щелкнуть, чтобы отправить форму.

Я хотел бы сделать то же самое с веб-клиентом Powershell, используя вспомогательные функции. Я не нашел такого скрипта. Самое близкое, что я смог найти, это The Scripting Guys, Send-WebRequest:

http://gallery.technet.microsoft.com/scriptcenter/7e7b6bf2-d067-48c3-96b3-b38f26a1d143

что я даже не уверен, что он делает то, что я ожидаю (поскольку нет рабочих примеров, показывающих, как делать то, что я хочу).

В любом случае, я был бы очень признателен за помощь, чтобы я начал делать эквивалент того, что я показал там, с рабочими примерами (как можно проще). Бонусом также будет возможность получить список имен элементов для URI, чтобы узнать, какие элементы формы я хочу отправить.

PS: мне также нужно указать пользовательский агент и учетные данные; поэтому примеры с включенными ими были бы идеальными.


person MKANET    schedule 09.11.2013    source источник


Ответы (1)


Вы смотрели на команду Invoke-WebRequest? (требуется powershell 3.0 или выше) Я считаю, что для отправки данных будет работать следующее

#POSTing data
Invoke-WebRequest http://www.websiteURI/ `
    -UserAgent 'My User Agent' `
    -Credential $cred `
    -Method Post `
    -Body @{
        q = 'powershell variable scope'
        num = 30
        lr = 'lang_en'
    }

В качестве бонуса результат Invoke-WebRequest содержит набор полей InputField на странице, которые можно использовать для получения списка устанавливаемых элементов формы.

#List input elements
Invoke-WebRequest http://www.websiteURI/ | select -ExpandProperty InputFields
person Alex    schedule 09.11.2013
comment
Да, я видел командлет Inoke-WebRequest. Я не был уверен в том, как сделать форматирование для параметра хеш-таблицы -body. Итак, как мне указать, какую кнопку нажать? Иногда есть несколько кнопок, на которые можно нажать при публикации данных. РЕДАКТИРОВАТЬ: Могу ли я просто добавить элемент click в хеш-таблицу -Body? Итак, я бы просто добавил ClickElementById = sb_form_go в последнюю строку параметра body? - person MKANET; 09.11.2013
comment
Было бы здорово получить реальный рабочий пример поиска google.com с помощью q = Invoke-WebRequest и публикации с помощью кнопка «Мне повезет». - person MKANET; 10.11.2013
comment
В чистом HTML нажатая кнопка на самом деле не влияет на отправляемые данные. Что имеет значение, так это форма, в которой находится элемент, и URL-адрес, на который эта форма отправляет обратно. Если вы имеете дело с сайтом AJAX, все становится немного сложнее, поскольку они могут выполнять дополнительную обработку того, что только что показано в форме. - person Alex; 10.11.2013
comment
Чтобы уточнить немного больше: если ваше приложение не имеет какого-либо Javascript, работающего с формой, то нажатая кнопка фактически не влияет на то, что отправляется. Данные — это просто входные данные в форме, в которой находится кнопка, и они отправляют данные на URL-адрес, указанный в форме, с указанным методом. Однако, если на вашей странице есть какой-то AJAX, все становится сложнее. Например, ASP.Net вставит идентификатор кнопки в отправляемое значение формы __EVENTTARGET. Чтобы использовать Invoke-WebRequest в этом сценарии, потребуется понять, как он преобразует нажатие кнопки в отправляемые данные. - person Alex; 10.11.2013
comment
Кажется, я понимаю, что ты говоришь. Я все еще надеюсь, что кто-нибудь будет достаточно любезен, чтобы показать мне рабочий пример того, как отправить поиск на google.com, как если бы я нажал кнопку «Мне повезет» и -Body @{q = 'Abraham Lincoln'} . - person MKANET; 10.11.2013
comment
Когда вы начинаете вводить данные в Google, он использует AJAX для отображения результатов в реальном времени, поэтому на самом деле нет прямого эквивалента с использованием Invoke-WebRequest. - person Alex; 10.11.2013
comment
Я бы рекомендовал использовать такой инструмент, как Fiddler, который дает вам представление о том, что именно отправляется по HTTP. Если вы запускаете fiddler, дважды щелкните запрос, чтобы просмотреть дополнительную информацию о нем. В частности, если вы посмотрите на вкладку WebForms, вы увидите любые опубликованные значения формы. Это значения, которые вы отправляете в хеш-таблицу Body. - person Alex; 10.11.2013
comment
Вау, спасибо за предложение Fiddler. Есть видеоуроки, которые действительно помогают мне увидеть/узнать, что именно происходит. Лучше всего то, что все это доступно через .NET; хотя командлеты очень ограничены. Кстати, благодаря приведенным здесь советам я уже могу публиковать данные формы на основе информации, которую я собираю, используя: Invoke-WebRequest URI | выберите -ExpandProperty поля ввода | выберите имя, значение - person MKANET; 11.11.2013