Нажатие кнопки браузера Gecko не работает C # - PullRequest
0 голосов
/ 31 августа 2018

Мне надоело эмулировать поиск в Google через веб-браузер gecko. пока я могу перейти на страницу Google, а затем искать что-то вроде этого:

    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. если я нажимаю кнопку программно, она тоже не работает.

1 Ответ

0 голосов
/ 04 сентября 2018

Я поиграл и воссоздал ваш сценарий в приложении 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: Тем не менее, ваши усилия могут или не могут быть не законными .
Возможно, вы захотите использовать вместо этого API пользовательского поиска Google или альтернативы, такие как SerpApi .

...