【问题标题】:Powershell: How to press a button on a web page if you don't know the button IDPowershell:如果您不知道按钮ID,如何在网页上按下按钮
【发布时间】:2014-06-17 06:10:59
【问题描述】:

我正在尝试在某个网页上填写我的用户名和密码,然后按“登录”按钮,这一切都是通过 Powershell 自动完成的。

问题是我在html源代码中找不到登录按钮的ID。

我尝试过使用命令:

$link = $ie.Document.getElementsByTagName('A') | where-object {$_.innerText -match 'sign in'}

但这也没有用。

如果我想按下“登录”按钮,有什么想法可以使用哪个 PS 命令?

HTML代码如下:

<div class="login">
    <div class="content">
        <div class="subsection-1">Sign in or create a <a id="ctl00_HeaderUserControl_LoginUserControl_hypNewAccount" href="/authentication/registerprovider.aspx?">new account</a></div>
        <div class="subsection-2">
            <span class="navy bold">What is your email address?</span>
            <div class="indent">
                <span class="bold">Email:</span>
                <input id="loginEmail" class="text-box" type="text" maxlength="100" tabindex="1" />
                <img class="ajax-loader" src="/content/images/research/global/transparent.gif" alt="" />
            </div>
            <div class="invalid-email"></div>
        </div>
        <div class="subsection-3">
            <span class="navy bold">Do you know your password?</span>
            <div>
                <input id="passwordNotKnown" name="passwordSwitch" type="radio" checked="checked" />
                <label for="noPassword">No, I don't know my password or I'm new .</label>
            </div>
            <div>
                <input id="passwordKnown" name="passwordSwitch" type="radio" />
                <label for="noPassword">Yes, my password is:</label>
                <input id="loginPassword" class="text-box" type="password" maxlength="50" tabindex="2" />
            </div>
            <div class="invalid-password"></div>
            <div class="error"></div>
        </div>
        <div class="subsection-4">
            <button type="button" class="login-button greenButton" tabindex="4">Sign in</button>
            <a href="javascript:void(0);" class="cancel-link">Cancel</a>
            <input id="stayLoggedIn" type="checkbox" tabindex="3" />
            <label for="stayLoggedIn">Stay signed in</label>
        </div>
    </div>
    <div class="reset-password">
        <div class="subsection-1">Would you like to reset your password?</div>
        <div class="subsection-2">Choosing <span class="bold">yes</span> will reset your password and email a temporary password to: <span class="repeat-email"></span></div>
        <div class="subsection-3">
            <div class="center">
                <button class="reset-password-button" type="button">Yes</button>
                <button class="do-not-reset-password-button" type="button">No</button>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 登录按钮不是A标签,而是一个按钮:&lt;button type="button" class="login-button greenButton" tabindex="4"&gt;Sign in&lt;/button&gt;
  • 您是否试图绕过 OpenID 或 OAuth 提供者的登录页面?如果您是,并且您被您正在使用的 API 提供商发现,您的 API 密钥可能会被撤销。

标签: html dom button powershell web


【解决方案1】:

我来这里是为了寻找类似的答案,并想出了如何完成这项工作。在这里张贴任何未来的搜索者。正如 Szymon 所指出的,getElementsByClassName 返回一个数组,您需要在单击之前选择所需的项目。在我的例子中,类名是button,我可以使用以下命令点击它:

$submitButton = $doc.documentElement.getElementsByClassName('button') | Select-Object -First 1
$submitButton.click() 

这对我有用,因为只有一个带有类名按钮的项目,所以如果你有多个具有相同名称的项目,你的结果会有所不同。如果需要,只需使用 select-object 更改您抓取的内容。

【讨论】:

    【解决方案2】:

    正如@Jamie-Taylor 所说,登录按钮实际上是一个按钮。

    您不仅可以通过 id 访问它,还可以使用 document.documentElement.getElementsByClassName 通过类名访问它。请注意,此函数将返回元素列表,因为页面上的多个元素可以具有相同的类。

    编辑 我错了:为了拥有getElementsByClassName,你必须在document.documentElement而不是document上调用它

    【讨论】:

    • 您好,感谢您的提示。我想我不得不说我是 PS 新手,并且仍在学习基础知识,所以如果我的问题可能很简单,我深表歉意。我使用了 getElementsByClassName:$ie.Document.getElementsByClassName("login-button greenButton").Click();但这会导致以下消息:方法调用失败,因为 [mshtml.HTMLDocumentClass] 不包含名为“getElementsByClassName”的方法。我做错了什么?
    • 感谢您回复我。这真让我抓狂。我现在使用命令:$ie.document.documentElement.getElementsByClassName('login-button greenButton')。点击 ()。它具有相同的结果:“方法调用失败,因为 [mshtml.HTMLHtmlElementClass] 不包含名为 'getElementsByClassName' 的方法。”我究竟做错了什么?如果您能再帮我一次,我将不胜感激。
    • 这很奇怪。我已经尝试过这段代码,它对我有用(确实不适用于文档)。我看到你错的是你在getElementsByClassName 的结果上调用Click,这是行不通的。此方法返回元素集合,因此您必须首先从中选择一个元素。
    • 感谢您的回答。这个问题正在扼杀我的大脑。您是否有可用的脚本,以便我可以查看存在哪些元素以及如何选择其中一个?提前致谢。
    • 我刚刚在控制台中针对 google.com 进行了操作。没有我可以分享的脚本。基本上我尝试了 $ie.Document.getElementsByClassName 和 $ie.Document.documentElement.getElementsByClassName ,后者起作用了。如果你真的不能让它工作,再试一次 getElementsByTagName 只记得搜索 button 而不是 a 并记住这将是一个元素数组。希望这会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多