2013-04-22 14 views
5

chcę kliknąć na link po przechodząc do internetowejJak kliknąć łącze za pomocą przeglądarki Webkit?

webKitBrowser1.Navigate("http://www.somesite.com"); 

Jak kliknij na link na tej stronie, zakładając, że id link jest lnkId?

<a href="http://www.google.com" id="lnkId"> Go to Google </a> 

W domyślnym kontrolą przeglądarki, która pochodzi z Visual Studio, można to zrobić za pomocą poniższego kodu:

foreach (HtmlElement el in webBrowser1.Document.GetElementTagName("a")) { 
if (el.GetAttribute("id") == "lnkId") { 
el.InvokeMember("click"); 
} 
} 

Co jest odpowiednikiem kodu powyżej, gdy używam WebkitDotNet kontroli?

+0

Nie bardzo rozumiem twoje pytanie, ale czy masz na myśli przytrzymanie klawisza CTRL i kliknięcie linku? – Max

+0

Edytowałem post @Mobstaa –

+0

Znalazłem tu kilka interesujących informacji: http://webkitdotnet.sourceforge.net/docs/ – Max

Odpowiedz

5

Ponieważ WebKit nie dostarcza zdarzenia Click() (see here for details), nie można tego zrobić w powyższy sposób. Ale mała sztuczka może pracować jako odpowiednik oryginalnego winforms sposób jak poniżej:

foreach (Node el in webKitBrowser1.Document.GetElementsByTagName("a")) 
{ 
    if (((Element) el).GetAttribute("id") == "lnkId") 
    { 
     string urlString = ((Element) el).Attributes["href"].NodeValue; 
     webKitBrowser1.Navigate(urlString); 
    } 
} 

Oto co robię jest odlanie przedmiotu WebKit.DOM.Node jej podklasy WebKit.DOM.Element aby uzyskać jego Attributes. Następnie dostarczając href do NamedNodeMap, tj. Attributes jako NodeName, można łatwo wyodrębnić NodeValue, czyli target url w tym przypadku. Następnie można po prostu wywołać metodę Navigate(urlString) w instancji WebKitBrowser, aby zreplikować zdarzenie click.

+0

Jestem tym z nagrodą, ale nie chciałem zadawać innego pytania, które byłoby raczej duplikować.Ustawiam tekst w polu tekstowym i muszę to zrobić tak, jak napisałeś, ale teraz nie ma opcji "SetAttribute". Jak ustawić atrybut? – Dozer789

+0

Czy mógłbyś sprawdzić metody jakie oferuje klasa 'WebKit.DOM.Element'? Możesz użyć wymaganej metody w następujący sposób: '((WebKit.DOM.Element) el) .SetAttribute (" NAME "," VALUE ");' –

+0

Wymyśliłem to samo, ale zapomniałem ci o tym powiedzieć. – Dozer789

1

Nie pracuję w systemie Windows i całe moje doświadczenie jest na Webkit GTK. Poniższe komentarze są oparte na tym doświadczeniu.

Nie jestem pewien, której wersji web .NET używasz. Wygląda na to, że istnieje wiele implementacji. Zakładając, że używasz wspomnianego przez Wasif, możesz ocenić javascript, jak wspomniano w przykładzie https://code.google.com/p/open-webkit-sharp/source/browse/JavaScriptExample/Form1.cs.

Faktycznie, jeśli implementacja wspiera wykonywanie javascript, można wykonać większość, jeśli nie wszystkie operacje DOM. Funkcje API są zwykle takie same jak funkcje javascript i przez większość czasu wywołują dokładnie te same funkcje wewnętrznie, pomimo pochodzenia. Komunikacja między twoją aplikacją a javascriptem może być trudna, ale jeśli potrafisz czytać komunikaty ostrzegawcze, to również możesz je rozwiązać. Wygląda na to, że ta biblioteka obsługuje mechanizm obsługi alertów. Narzędzie, które napisałem pod numerem https://github.com/nhrdl/notesMD, pokaże kilka przykładów osiągnięcia tej komunikacji, mimo że używa wersji GTK i jest napisane w pythonie.

Nawiasem mówiąc, jeśli znasz identyfikator elementu, to Document.GetElementById zapisze ci pętlę.

-1
webKitBrowser1.StringByEvaluatingJavaScriptFromString("var inpt = document.createElement(\"input\"); inpt.setAttribute(\"type\", \"submit\"); inpt.setAttribute(\"id\", \"nut\"); inpt.setAttribute(\"type\", \"submit\"); inpt.setAttribute(\"name\", \"tmp\"); inpt.setAttribute(\"value\", \"tmp\"); var element = document.getElementById(\"lnk\"); element.appendChild(inpt);"); 
        webKitBrowser1.StringByEvaluatingJavaScriptFromString("document.getElementById('nut').click();"); 
Powiązane problemy