【问题标题】:How do i get from a website a class element value?如何从网站获取类元素值?
【发布时间】:2015-12-23 22:25:48
【问题描述】:

我有这个元素

<span class="validationMsg">
    <span id="TapuzLogin1_ctl01_UserNameRequired" title="יש להקליד שם משתמש" style="color:Red;display:none;">* יש להקליד שם משתמש<br>
    </span>
    <span id="TapuzLogin1_ctl01_PasswordRequired" title="יש להקליד סיסמה" style="color:Red;display:none;">* יש להקליד סיסמה<br>
    </span>שם המשתמש או הסיסמה אינם נכונים
</span>

类是“validationMsg” 我需要获取字符串的值在底部:

שם המשתמש או הסיסמה אינם נכונים

这是希伯来语。

我可以通过Id获取和使用

private void button1_Click(object sender, EventArgs e)
{
   navigate("mysite.net");
   webBrowser1.Document.GetElementById("UserName").InnerText = textBox1.Text.ToString();
   webBrowser1.Document.GetElementById("Password").InnerText = textBox2.Text.ToString();
   webBrowser1.Document.GetElementById("LoginButton").InvokeMember("click");
}

但是我如何获得类元素值这个希伯来语字符串表示我是否正常登录。 我想检查如果这个元素包含这个字符串那么登录是错误的。

这是我在 form1 中如何登录的完整代码。 如果我输入正确的用户名和密码,我就可以正常登录。 但是我怎样才能指出输入的密码或用户名是否错误?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using mshtml;
using HtmlAgilityPack;

namespace WebSite_Login_And_Browsing
{
    public partial class LogIn : Form
    {
        IHTMLDocument2 doc;
        string pagecontent;

        public LogIn()
        {
            InitializeComponent();

            webBrowser1.ScriptErrorsSuppressed = true;
        }

        public void ihtml(HtmlAgilityPack.HtmlDocument dom)
        {
            try
            {
                pagecontent = "";
                doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
                pagecontent = doc.body.innerHTML;
                dom.LoadHtml(pagecontent);
            }
            catch (Exception)
            {
                dom.LoadHtml(webBrowser1.DocumentText.ToString());
            }

        }

        public void navigate(string url)
        {
            webBrowser1.Navigate(url);
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            navigate("http://www.tapuz.co.il/Common/SignInPage.aspx?backUrl=http://www.tapuz.co.il/Common/SignIn.aspx@loginDone=1");

            webBrowser1.Document.GetElementById("UserName").InnerText = textBox1.Text.ToString();       webBrowser1.Document.GetElementById("Password").InnerText = textBox2.Text.ToString();          webBrowser1.Document.GetElementById("LoginButton").InvokeMember("click");
        }
    }
}

我在button1点击按钮事件中的代码

private void button1_Click(object sender, EventArgs e)
            {
navigate("http://www.tapuz.co.il/Common/SignInPage.aspx?backUrl=http://www.tapuz.co.il/Common/SignIn.aspx@loginDone=1");         webBrowser1.Document.GetElementById("TapuzLogin1_ctl01_UserName").InnerText = textBox1.Text.ToString();         webBrowser1.Document.GetElementById("TapuzLogin1_ctl01_Password").InnerText = textBox2.Text.ToString();       webBrowser1.Document.GetElementById("TapuzLogin1_ctl01_LoginButton").InvokeMember("click");
            }

文档完成事件

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            var items = webBrowser1.Document.GetElementsByTagName("span");
            foreach (HtmlElement item in items)
            {
                if (item.GetAttribute("className") == "validationMsg")
                {
                    logingResults = item.InnerText;
                    if (logingResults.Contains("שם המשתמש או הסיסמה אינם נכונים"))
                        break;
                }
            }
        }

【问题讨论】:

  • Document.GetElementsByTagName,遍历返回的数组,寻找具有您感兴趣的类名的数组。
  • 如果我想从这篇文章中提取一个问题,请问有什么问题?这是您的问题:我想点击给定page 中的登录按钮并检查结果页面中是否有&lt;/span&gt;שם המשתמש או הסיסמה אינם נכונים&lt;/span&gt;
  • 什么是“public void ihtml(HtmlAgilityPack.HtmlDocument dom)”?
  • 给定的网站有 404 问题或其他问题

标签: c# html .net winforms


【解决方案1】:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using mshtml;
using HtmlAgilityPack;

namespace WebSite_Login_And_Browsing
{
    public partial class LogIn : Form
    {
        public LogIn()
        {
            InitializeComponent();

            webBrowser1.ScriptErrorsSuppressed = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.DocumentCompleted += process1;
            webBrowser1.Navigate("http://www.tapuz.co.il/Common/SignInPage.aspx?backUrl=http://www.tapuz.co.il/Common/SignIn.aspx@loginDone=1");
        }

        private void process1(object sender, WebBrowserDocumentCompletedEventArgs args)
        {
            webBrowser1.DocumentCompleted -= process1;
            webBrowser1.DocumentCompleted += process2;

            try
            {
                webBrowser1.Document.GetElementById("UserName").InnerText = textBox1.Text.ToString();
                webBrowser1.Document.GetElementById("Password").InnerText = textBox2.Text.ToString();
                webBrowser1.Document.GetElementById("LoginButton").InvokeMember("click");
            }
            catch
            {
                webBrowser1.DocumentCompleted -= process2;
            }
        }

        private void process2(object sender, WebBrowserDocumentCompletedEventArgs args)
        {
            webBrowser1.DocumentCompleted -= process2;

            var items = webBrowser1.Document.GetElementsByTagName("span");
            foreach (HtmlElement item in items)
            {
                if (item.GetAttribute("className") == "validationMsg")
                {
                    if (item.InnerText.Contains("שם המשתמש או הסיסמה אינם נכונים"))
                    {
                        MessageBox.Show("State 1");
                        return;
                    }
                }
            }

            MessageBox.Show("State 2");
        }
    }
}

【讨论】:

  • 这段代码在我的机器上运行。我不知道你为什么会出错。
  • Levent 有一个错误我修复了我错误地输入了第一个 GetElementByID 而不是 UserName 它是 UserNamm 但现在在修复它之后当它到达 process2 事件时它只在 foreach 中进行一次迭代它进入了第二个 IF: if (item.InnerText.Contains and hterefore 它只得到了validationMsg的第一个结果而不是其他结果。有什么想法为什么要在那里进行一次迭代吗?
  • 我的意思是它在 foreach 4 次迭代中执行 4 次循环,但进入 if (item.InnerText.Contains 仅一次。它仅在此行之后进入一次:if (item.GetAttribute(" className") == "validationMsg")
  • 我还扩展了此检查,如果检查:if(item.innertext.contains(“ thourynertext.contains)(“”שםשםשםאאאאאאסססאאנכנכנםננים现在我得到第二个字符串:“קיימת חריגה במספר נסיונות הכניסה”,但我无法理解。也许它不在同一个 validationMsg className 中?我得到的第二个字符串是我尝试登录太多次的警告。
  • 我现在再次检查了第二个字符串 קיימת חריגה במספר נסיונות הכניסה הכניסה הכניסה הכניסה 在同一个类名validationMsg中,但是foreach循环没有到达那里它到达if只包含一次其他3个循环根本没有到达那里.
【解决方案2】:
var items = webBrowser1.Document.GetElementsByTagName("span");
foreach (HtmlElement item in items)
{
    if (item.GetAttribute("className") == "validationMsg")
    {
        // Now you can check the item's value by comparing item.InnerText
    }
}

【讨论】:

  • Levent 在循环内它会到达“* יש להקליד שם משתמש\r\n* יש להקליד סיסמה”的内部文本,但它不会在它之后继续并且没有到达שםהמתתת או הסיסמה אינם נכונים 我使用了断点。我在最后一个 GetElementById 行之后的 button1 点击事件内编辑了你的答案。在你回答的循环里面我做了: string result = item.InnerText;但在第一次迭代之后,它不会继续到下一次。
  • 您可以在 button1 点击事件处理程序中发布您的代码吗?
  • 嗯,这是一个重要的问题。您应该始终等待 webBrowser1.DocumentCompleted 事件,以便对 Document 对象进行操作。
  • 我不确定但使用 item.InnerHtml 代替 item.InnerText 可以解决 问题
  • while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } 这个代码很危险,应该避免。事件处理不是通过这种方式完成的。
【解决方案3】:

不确定你是否愿意使用 javascript 来获取文本。希望这个 sn-p 对你有所帮助

document.getElementsByClassName('validationMsg')[0].innerText

WORKING DEMO

如有遗漏请见谅

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2021-04-26
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多