【问题标题】:gecko browser button click doesn't work c#壁虎浏览器按钮单击不起作用c#
【发布时间】:2018-08-31 14:07:35
【问题描述】:

我厌倦了用壁虎网络浏览器模拟谷歌搜索。到目前为止,我已经能够去谷歌页面,然后搜索一些这样的东西:

    geckoWebBrowser1.Navigate("https://www.google.com/");
    await Task.Run(() => CheckDocumentLoaded());

    var page = geckoWebBrowser1.Document.GetElementById("lst-ib");
    (page as GeckoHtmlElement).Focus();
    (page as GeckoInputElement).Value = "something";

现在我只想点击搜索按钮。所以我将此添加到第一部分:

    var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
    button.Click();

但有趣的事情发生了。如果我在第一部分之后运行此代码,则不会发生任何事情。但是如果我创建了一个按钮并将代码放在上面,它就可以正常工作。

private void Button1_Click(object sender, EventArgs e)
{
    var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
    button.Click();

    return;
}

但我必须手动单击按钮才能使其工作。它真的令人困惑。我不知道是什么原因造成的!!

注意:

  1. 如果你想让代码正常工作,你必须使用这个用户代理:(Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko)

  2. 我不想使用SendKeys.Send("{ENTER}")

  3. 如果我以编程方式按下按钮,它也不起作用。

【问题讨论】:

  • 如果“mKlEF”是一个按钮,那么您应该能够将返回值从 GetElementById 转换为 GeckoButtonElement,而不是创建另一个。怀疑它是你问题的原因。
  • 一些猜测: 1. 不要关注 lst-ib 元素。 2. 聚焦按钮。
  • 亲爱的@Tom。我试过了,但没有用。
  • 我认为这是由 Google 起始页的 AJAX 特性引起的。

标签: c# webbrowser-control gecko geckofx


【解决方案1】:

我在 WPF 应用程序中尝试并重新创建了您的场景。

我使用DocumentCompleted 事件让它工作

在浏览器完成解析新页面并更新 Document 属性后发生。

我在导航之前订阅事件侦听器,并在调用处理程序后将其删除。

然后,我调用form 的第一个元素来提交搜索。

(_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();

完整代码示例:WPF 应用程序

using Gecko;
using Gecko.DOM;
using System.Windows;
using System.Windows.Forms.Integration;
using System.Linq;    
namespace GeckoWpf {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            Gecko.Xpcom.Initialize("Firefox");
        } 

        void browser_DocumentCompleted(object sender, System.EventArgs e) {
             //unsubscribe
            _browser.DocumentCompleted -= browser_DocumentCompleted;

            XPathResult xpathResult = _browser.Document.EvaluateXPath("//div/input");
            var foundNodes = xpathResult.GetNodes();
            foreach (var node in foundNodes) {
                GeckoInputElement txtbox = new GeckoInputElement(node.DomObject);
                txtbox.Value = "Mona Lisa"; //add the search term
            }    
            (_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
        }

        WindowsFormsHost _host = new WindowsFormsHost();
        GeckoWebBrowser _browser = new GeckoWebBrowser();    
        private void Window_Loaded(object sender, RoutedEventArgs e) {
            _browser.DocumentCompleted += browser_DocumentCompleted;
            _host.Child = _browser;    GridWeb.Children.Add(_host);    
            _browser.Navigate("https://www.google.com/");
        }
    }
}

注意:此方法可能不适用于所有页面,因为 DocumentComplete 可能会因各种原因(例如 i/frames、AJAX 和其他动态内容)被多次触发。

PS:尽管如此,您的努力可能会或可能会not be legal
您可能需要考虑使用Google's custom search APISerpApi 等替代方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多