Не могу войти, чтобы дергаться с помощью PowerShell - PullRequest
1 голос
/ 06 августа 2020

Я работаю над сценарием PowerShell для входа в систему, чтобы дергаться через Inte rnet Explorer. Мне удалось заполнить поля имени пользователя и пароля, но кнопка «Войти» остается отключенной. Кнопка входа в систему должна быть включена и нажмите для успешного входа. Пожалуйста, помогите мне сделать эту работу. Ниже мой сценарий

$Url ="https://www.twitch.tv/login"
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Visible= $true # Make it visible

$username="Your_User_Name"
$password="Your_Password"

$ie.Navigate($Url)

while($ie.Busy) { Start-Sleep -Seconds 2 }
while($ie.ReadyState -ne 4) {start-sleep -m 100} 

$usernamefield = $ie.Document.IHTMLDocument3_getElementById("login-username")  
$usernamefield.value = $username;

$passwordfield = $ie.Document.IHTMLDocument3_getElementById("password-input")
$passwordfield.value = $password;

$loginbutton = $ie.document.getElementsByTagName("button")[3].click()

Как показано на снимке экрана, имя пользователя и пароль заполняются в обязательных полях, но кнопка «Войти» остается отключенной после запуска сценария и не нажимается для входа в систему

1 Ответ

1 голос
/ 06 августа 2020

Кажется, что поля ввода на самом деле не принимают значения. В дополнение к этой проблеме есть две кнопки входа в систему. Один из них - "отключенный", который вы видите, а другой отображается, когда поля ввода заполнены. Следующая команда показывает разницу в css для каждого из них.

$ie.Document.getElementsByTagName("Button") | where {$_.textContent -eq "Log In"} | foreach {"Log In button`n";$_.outerhtml;"`n"}

Log In button

<button class="tw-block tw-c-text-inherit tw-full-height tw-full-width tw-interactive tw-pd-l-0 tw-pd-r-1 tw-tab-item" role="tab"><div class="tw-align-left tw-flex tw-flex-column tw-full-heig
ht"><div class="tw-flex-grow-0"><div class="tw-font-size-5 tw-regular">Log In</div></div><div class="tw-flex-grow-1"></div><div class="tw-flex-grow-0"><div class="tw-tabs__active-indicator" d
ata-test-selector="ACTIVE_TAB_INDICATOR"></div></div></div></button>


Log In button

<button disabled="" class="tw-align-items-center tw-align-middle tw-border-bottom-left-radius-medium tw-border-bottom-right-radius-medium tw-border-top-left-radius-medium tw-border-top-right-
radius-medium tw-core-button tw-core-button--disabled tw-core-button--primary tw-full-width tw-inline-flex tw-interactive tw-justify-content-center tw-overflow-hidden tw-relative" data-a-targ
et="passport-login-button"><div class="tw-align-items-center tw-core-button-label tw-flex tw-flex-grow-0"><div class="tw-flex-grow-0" data-a-target="tw-core-button-label-text">Log In</div></d
iv></button>

Если мы используем модуль Selenium Powershell, это несколько упрощает задачу, хотя требование для Inte rnet Explorer сделало его немного больше испытывающий. Следующий код можно использовать для успешного входа в Twitch с помощью Inte rnet Explorer.

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

1..4 | foreach {
    Set-ItemProperty "hkcu:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\zones\$_\" -Name 2500 -Value 3
}

Теперь мы можем автоматизировать вход в систему. Проблема с поиском кнопки по тегу заключается в том, что в IE возвращается только одна кнопка. Используя xpath, мы можем найти все кнопки и отфильтровать по тексту.

Install-Module Selenium -Scope CurrentUser -Force

$Url ="https://www.twitch.tv/login"
$username="Your_User_Name"
$password="Your_Password"

$driver = Start-SeInternetExplorer -StartURL $Url

$usernamefield = $driver.FindElementById("login-username")

Send-SeKeys -Element $usernamefield -Keys $username

$passwordfield = $driver.FindElementById("password-input")

Send-SeKeys -Element $passwordfield -Keys $password

$loginbutton = $driver.FindElementsByXPath("//button")| where text -eq 'Log In' | select -last 1

$loginbutton.Click()

Я по-прежнему рекомендую использовать Chrome, Firefox или New Edge вместо IE. Следующий код даст тот же результат в Chrome.

Install-Module Selenium -Scope CurrentUser -Force

$Url ="https://www.twitch.tv/login"
$username="Your_User_Name"
$password="Your_Password"

$driver = Start-SeChrome -StartURL $Url

$usernamefield = Find-SeElement -Driver $driver -Id "login-username"

Send-SeKeys -Element $usernamefield -Keys $username

$passwordfield = Find-SeElement -Driver $driver -Id "password-input"

Send-SeKeys -Element $passwordfield -Keys $password

$loginbutton = Find-SeElement -Driver $driver -By TagName "button" | where text -eq 'Log In' | select -last 1

$loginbutton.Click()
...