如何从C#中单击Web窗体上没有任何ID和名称的元素(超链接)

如何从C#中单击Web窗体上没有任何ID和名称的元素(超链接),c#,.net,winforms,hyperlink,webbrowser-control,C#,.net,Winforms,Hyperlink,Webbrowser Control,在过去的两周里,我一直被一个问题困扰着 我正在使用C#开发一些web scraper,并在我的应用程序中使用WinForms WebBrowser控件。我可以填写在浏览器中打开的web表单,并使用以下代码自动提交: HtmlElement submitButton = document.GetElementById("Element_ID″); submitButton.InvokeMember(“click”); 到目前为止,一切都很好,但问题是web表单中还有一个元素我也想单击,但是这个元

在过去的两周里,我一直被一个问题困扰着

我正在使用C#开发一些web scraper,并在我的应用程序中使用WinForms WebBrowser控件。我可以填写在浏览器中打开的web表单,并使用以下代码自动提交:

HtmlElement submitButton = document.GetElementById("Element_ID″);
submitButton.InvokeMember(“click”);
到目前为止,一切都很好,但问题是web表单中还有一个元素我也想单击,但是这个元素没有任何id或名称,所以我不知道如何单击这个元素

请尽快帮助我,我的硕士论文需要它

(我想单击give网站中的下一页箭头按钮:
)

我以前写过很多使用嵌入式WebBrowser的web scraper,所以你来对地方了

当元素没有名称时,您需要通过内容或另一个已命名的关联元素来查找它

  • 在第一个实例中,我们编写了helper方法来迭代层次结构,查找元素中的特定内容
  • 对于第二个选项,您将获得命名元素并为所需的子元素使用特定索引
  • 两者的组合(找到特定的父对象,然后查找具有正确内容的子对象)
在您的特定示例网页中,下一页锚定有一个类类型,即您可以搜索的
“arrow next”

HtmlElement next_arrow =  document.GetElementsByTagName("a")
                               .Cast<HtmlElement>()
                               .Where(e => e.GetAttribute("class") == "arrow next")
                               .FirstOrDefault();
if (next_arrow != null)
{
     next_arrow.InvokeMember("click");
}
htmlement next\u arrow=document.GetElementsByTagName(“a”)
.Cast()
.Where(e=>e.GetAttribute(“类”)==“箭头下一步”)
.FirstOrDefault();
如果(下一个箭头!=null)
{
下一个箭头。调用成员(“单击”);
}

这里有一个技巧,不是通过
调用记忆(“单击”)
而是“模拟单击”——

这是第一页的链接:

gelbeseiten.de/yp/11//subscriberlist_pageAction.yp?sessionDataString=H4SiaaaaaaaaAaI2pQU8CmrCffw0xSemns9128K5KongWgJfeszftiqilBHCVF70NSGG3X-PBYXjLvCFPQSBIMPWBRRUBABELKM6IEW5T4GLFUPDMKPEG8V7IxAlfPdX6MP31BH4WqFzBLJEHxCd2TGVR0WbWbVikJJJJJJJJJKmoa3ATCRST4P4PzL7HzL7ZYYL7LZYP7P7LZYLZYLZYP4P7ZLZLZLZYP7ZLZYYP7ZLZYYP7LZLZYYYYE3Xzw-pncUtGSDNp0ZZwR0we92TxSHjIX0x-pIQM-p0AZuciLl7M/kGE-pmcGjIOsvEpTB-pADJS0suGAQAA&page=0&filterTrade=-&filterFunction=-&sortBy=sort\u trade&availableeletters=abcdefghijjklmnopqrstuvw

如您所见,page=0;单击“下一步”,提供链接-

gelbeseiten.de/yp/11//subscriberlist_pageAction.yp?sessionDataString=H4SiaaaaaaaaI2PQ/DMAyFf00vmzLFdprE8gkmwTggEENcp3RNxxh0o-pmA8euJBlO1G0-p-pvCf58zNwUzW-PdkyqqLsMcKexL6DqJPKnpceUvBdayFuvCeI6X5Xac-PzN89xWowed2MVQBMI731RF1L4SakFF9ObJbjTew4HSI-PqL4H9Eq2Dq2Dq2Dq2Dq2DqHw5Hw1d1d1d1d1d8Fc8Fc8Fc8Fc8L4H8O8OzzZZZ8O8O8O8Cv8PzzWm7Tt-psXxtNwCMmjS4BhJ7oDAy72WR5CH/MT0l1HQEVa46QDK2Z/JsTyhcdIAWrZeGy8/k7LJ5YQBAAA-e&page=1&filterTrade=-&filterFunction=-&sortBy=sort\u trade&availableeletters=ABCDEFGHIJKLMNOPQRSTUVW

现在page=1


等等。。。通常,单击下一步表示页面=(x+1)单击上一步表示页面=(x-1)。因此,根据需求构建一个字符串。这解决了您的问题,但是querystring也发送了一些其他数据,您还必须将这些数据附加到字符串中。

我想您会发现类名是“arrow next”,不是“next arrow”,而是一个很好的示例。这段代码非常有用,现在一切都正常运行,非常感谢。对于这种情况,非常正确,但这一技巧在许多网站上都不可用。在刮板中单击模拟通常更容易。