Domanda

Sto scrivendo uno script PowerShell che simula le azioni eseguite dall'utente sulla pagina. Ho un problema con l'esecuzione del clic su un pulsante. La pagina ha un modulo e un pulsante interno che salva le modifiche al database:

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

Devo invocarlo dal lato client. Il problema è che il pulsante stesso ha id = " " e tag = " " quindi il seguente non funziona:

$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();

sia getElementbyID che getElementsByTagName eseguono solo alcune operazioni ma l'unico effetto che hanno è il mio utilizzo della CPU che salta al massimo.

Stavo pensando di ottenere elementi [] del modulo e trovare il pulsante lì, ma non lo fa (effetti come nel caso precedente).

Esiste un altro (geniale) modo per farlo (di cui ovviamente non sono a conoscenza)? Avrei bisogno di qualcosa come InvokeScript

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

ma devo usare l'istanza di IE manipolata da PowerShell (o altro linguaggio di programmazione / scripting, forse VBScript?), non app standalone .NET.

È stato utile?

Soluzione

2 ° tentativo

Il codice seguente cerca e fa clic su tutti gli elementi input che hanno un attributo value = " Salva modifiche " .

Ho dovuto leggere la proprietà nodeValue dell'attributo in modo dinamico poiché non era esposto nell'interfaccia.

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()
    }
}

Questo è il mio 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>

Altri suggerimenti

Yoosiba,   Ho avuto problemi simili. Posso procurarti il ??nome dell'elemento. Esegui questo codice dalla CLI. Quindi utilizzare il tasto Tab per evidenziare l'elemento su cui si desidera fare clic.   Quindi puoi digitare " $ doc.activeelement " per ottenere le proprietà dell'elemento desiderato. Ricorda che puoi ottenere elementi per nome, nome o ID. Ho dovuto fare una specie come questa per ottenere l'elemento che volevo:

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

Probabilmente puoi fare qualcosa di simile. Dave M

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top