Powershell: веб-форма IE - не удается определить поля ввода для ввода данных - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь заполнить некоторые текстовые поля ввода / вывода в IE скриптом PowerShell (PoSH), и я использую примеры, представленные в Интернете, включая здесь и здесь .

Однако я не смог получить или идентифицировать текстовые поля с помощью GetElementsByTagName() - я думаю, что это действует так, как будто они не заполняются в переменной.Я не уверен, что происходит, я искал в интернете (поиски Google), но не видел ничего, что говорило бы о чем-то большем, чем только эти несколько строк кода.

Коди рисунки, а также ошибка для следования:

$url = "[webPage]";

#initialize browser
$ie = New-Object -Com InternetExplorer.Application;
$ie.Visible = $true;
$ie.ParsedHTML;
$ie.Navigate($url);
while ($ie.busy) {Start-Sleep 4}

#get form
$doc = $ie.Document;
$form =  $doc.Forms[0];
$inputs = $form.GetElementsByTagName("input");

#fill out form fields
#either this: 
$ie.Document.GetElementByID("sys_display.IO:69c7ac57db7f7a00d7efb96c4e9619ae").Value = "Jonathan Rotter"
#or this:
($inputs | where {$_.Name -eq "sys_display.IO:69c7ac57db7f7a00d7efb96c4e9619ae"}).Value = "Test"

Я попытался добавить следующее в начало этого (из здесь ), но без изменений:

[void][System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")

Я вижу идентификатор / имя / (имя тега ??) на странице:

InputField

Я ввелСкрипт PoSH построчно (чтобы убедиться, что веб-страница загружена правильно) и проверен на выходе, и (в качестве примера) следующая строка приводит к этому сообщению об ошибке:

($inputs | where {$_.Name -eq "sys_display.IO:69c7ac57db7f7a00d7efb96c4e9619ae"}).Value = "Test"


The property 'value' cannot be found on this object. Verify that the
property exists and can be set. At line:1 char:1
+ ($inputs | where {$_.name -eq "sys_display.IO:69c7ac57db7f7a00d7efb96 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound

Послевыполняя все шаги, эти две строки показывают следующее:

PS> $inputs | Select-Object Type,Name
type   name
----   ----
hidden sysparm_ck 
search sysparm_search

PS> $doc.IHTMLDocument3_getElementsByTagName("input") | Select-Object Type,Name
type     name
----     ----
hidden   sysparm_ck
search   sysparm_search
checkbox 843.8919931998148glide_ui_accessibility
checkbox 265.6701858983173glide_ui_compact
checkbox 689.5920854347255glide_ui_short_date_format
radio    884.3975056898055my_home_navigation_page
radio    884.3975056898055my_home_navigation_page
radio    38.12548394764709glide_ui_date_format
radio    38.12548394764709glide_ui_date_format
radio    38.12548394764709glide_ui_date_format
radio    theme
radio    theme
radio    theme
radio    theme
radio    theme
radio    theme
radio    theme
radio    theme
checkbox 246.5551307536581table_wrap
checkbox 498.31620519246865tabbed_forms
radio    436.6892116346038glide_ui_related_list_t...
radio    436.6892116346038glide_ui_related_list_t...
radio    436.6892116346038glide_ui_related_list_t...
checkbox 693.6896755526656connect_notifications_m...
checkbox 68.17405211392419connect_notifications_d...
checkbox 958.4840125981943connect_notifications_e...
checkbox 276.20029685304047connect_notifications_...
hidden   sysparm_ck
search   filter
search   leftSearch
search

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

Edit 20181218 Похоже, поля, которые мне нужны, находятся внутри "iframe".Я все еще борюсь с углублением в это с помощью кода, и я играю с этой найденной строкой Здесь , но я все еще не уверен, как добраться до нее (с поправкой на мою веб-страницу скод выше):

$form=$doc.frames.document.forms

Дает мне больше материала, чтобы посмотреть, , но эти ошибки изменили это:

PS U:\> $ie.document.getElementByID("gsft_main")
Exception from HRESULT: 0x800A01B6

На это и посмотрели еще немного:

$frame=$ie.document.IHTMLDocument3_getElementByID("gsft_main")

Изображения из проверки (F11):

iframe1 iframe2

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

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

Так что вместо поиска sys_display.IO:69c7ac57db7f7a00d7efb96c4e9619ae вы можете начать с поиска <div class='input-group' изатем ищем <input>, затем сопоставляем имя с sys_display.Вы также можете попробовать сопоставить ac_colums=email и родительский элемент <div class='input-group', что поможет сузить параметры, которые необходимо искать.

* Справедливое предупреждение, я делал это только с Selenium, а не с IE Webform... Если возможно, вам может понадобиться использовать поиск XPath, чтобы вы могли одновременно сопоставить тег / класс / имя.

0 голосов
/ 15 декабря 2018

Вы не показываете целевой URL, почему?Это внутренний сайт, отсюда и санитария?

Вы можете обойти поля формы напрямую, используя, скажем, такой подход ...

$w = Invoke-WebRequest -Uri 'Some url'
$w.StatusCode
$w.AllElements
$w.Links
$w.Forms
$w.Forms[0].Fields
$w.RawContent
$w.ParsedHtml

Затем, когда у вас есть это, вы можете выполнить оставшийся вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...