вызвать __dopostback внутри IE через powershell - PullRequest
1 голос
/ 04 марта 2009

Я пишу скрипт powershell, который имитирует действия, выполняемые пользователем на странице. У меня проблема с выполнением нажатия на кнопку. Страница имеет форму и внутри кнопку, которая сохраняет изменения в базе данных:

input type="button" onClick="__doPostBack('someIdentifier','SAVE')" value="Save changes"

Мне нужно вызвать это на стороне клиента. Проблема в том, что кнопка сама имеет id = "" и tag = "", поэтому следующее не работает:

$ie = new-object -com "InternetExplorer.Application";
$ie.visible = $true;
$ie.navigate("http://myTestedPage.com");
$doc = $ie.Document;

#doesn't work
$save = $doc.getElementByID("")
#doesn't work neither
$save = $doc.getElementsByTagName("");

#so how to call
$save.click();

и getElementbyID, и getElementsByTagName просто выполняют некоторые операции, но единственный эффект, который они имеют, - это использование моего ЦП, которое достигает максимума.

Я думал о том, чтобы получить elements[] формы и найти там кнопку, но это не так (эффекты, как в предыдущем случае).

Есть ли другой (блестящий) способ сделать это (о котором я, очевидно, не знаю)? Мне нужно что-то вроде InvokeScript

webBrowser = new System.Windows.Forms.WebBrowser()
webBrowser.Document.InvokeScript(@"__doPostBack", new object[] {@"someIdentifier", @"SAVE"});

но мне нужно использовать экземпляр IE, управляемый PowerShell (или другим языком сценариев / программирования, может быть, VBScript?), А не автономное приложение .NET.

Ответы [ 2 ]

1 голос
/ 04 марта 2009

2-я попытка

Следующий код ищет и щелкает по всем элементам input, которые имеют атрибут value="Save changes".

Мне пришлось динамически читать свойство nodeValue атрибута, так как оно не отображалось в интерфейсе.

function getProperty ([System.__ComObject] $obj, [string] $prop)
{
    [System.__ComObject].InvokeMember($prop, [System.Reflection.BindingFlags]::GetProperty, $null, $obj, $null)
}

$ie = new-object -com "InternetExplorer.Application"
$ie.visible = $true
$ie.navigate('e:\scratch\h.html')
$doc = $ie.Document

$inputElts = $doc.getElementsByTagName('input')
foreach ($elt in $inputElts)
{
    $a = $elt.getAttributeNode('value')
    if ($a -and (getProperty $a 'nodeValue') -eq 'Save changes')
    {
        $elt.Click()
    }
}

Это мой HTML:

<html>
<head>
<script type="text/javascript">
function alertMsg() {alert("Button was clicked!")}
</script>
</head>
<body>
<form>
<input type="button" onclick="alertMsg()"  value="Save changes" />
</form>
</body>
</html>
0 голосов
/ 06 июня 2011

Yoosiba, Я боролся с подобной проблемой. Я могу получить вам имя элемента. Запустите этот код из CLI. Затем используйте клавишу Tab, чтобы выделить элемент, который вы хотите щелкнуть. Затем вы можете набрать «$ doc.activeelement», чтобы получить свойства элемента, который вы хотите. Помните, что вы можете получить элементы по тэгу, имени или идентификатору. Мне нужно было сделать что-то вроде этого, чтобы получить элемент, который я хотел:

$ link = $ doc.getElementsByTagName ("A") | где {$ _. sourceIndex-like "256"}

Возможно, вы можете сделать что-то подобное. Дейв М

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