NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: ovládánícontrol prvků na stránce webového prohlížeče programem, místo uživatelem

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Vocel
Tvůrce
Avatar
Petr Vocel:2.11.2016 13:22

Ahoj. Chtěl bych napsat program v c#, který používá prwek webový prohlížeč, ale umí dosadit např. přihlašovací údaje, heslo a podobně, ale hlavně vyvolat akci např. stisk tlačítka "OK", aby mohl pracovat bez interakce uživatele a dostat se na odpovídající stránky sám. Určitě to jde, když prohlížeč umí např. heslo dosadit, ale nevím jak. Nezná někdo řešení nebo alespoň tip. Díky
Petr

 
Odpovědět
2.11.2016 13:22
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:2.11.2016 17:25

Selenium?

 
Nahoru Odpovědět
2.11.2016 17:25
Avatar
Petr Vocel
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Vocel:3.11.2016 9:28

Díky za tip. Zkusím nastudovat a zaintegrovat do programu. Potřebuji se vlastně dostat hlavně přes "automatické" přihlášení. Program píšu ve Visual expres 2015 a používám standardní webbrouser.

 
Nahoru Odpovědět
3.11.2016 9:28
Avatar
Neaktivní uživatel:3.11.2016 11:18

Pokud nejde o nějakou složitou automatizaci, tak by se to možná dalo řešit nějakou takovouhle cestou, ne?

private void AutoLogin()
{
    // Inicializace WebBrowseru
    WebBrowser webBrowserForLogin = new WebBrowser();

    // Vyvolání události po načtení celého dokumentu
    webBrowserForLogin.DocumentCompleted += new webBrowserDocumentCompletedEventHandler(LogIn);

    // Nastavení url pro načtení dokumentu
    webBrowserForLogin.Url = new Uri("http://www.neco.cz");
}

private void Login(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser webBrowser = (WebBrowser)sender;

    // Z html dokumentu vyber element s id Name a nastav hodnotu na Franta
    webBrowser.Document.GetElementById("Name").SetAttribute("value", "Franta");

    // Z html dokumentu vyber element s id password a nastav hodnotu na tajneheslo
    webBrowser.Document.GetElementById("password").SetAttribute("value", "tajneheslo");

    // Z html dokumentu vyber tlačítko s id Submit a klikni na něj
    webBrowser.Document.GetElementById("Submit").InvokeMember("click");
}
Nahoru Odpovědět
3.11.2016 11:18
Neaktivní uživatelský účet
Avatar
Petr Vocel
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Vocel:6.11.2016 7:47

Ahoj,
Díky za tip, zkusil jsem a funguje skvěle, ale jenom na www, stránce, ze které jsem pomáhal kamárádovi automatizovaně stáhnout nějaké obchodní údaje do Excellu. Tam kde jsem to chtěl použít, tak tam jsem si nabil hubu. Zkoušel jsem SeleniumWebDriver, ale smál se mi že žádný takový prvek nenašel, i když jsem šel podle "textu". Stránka nejde uložit. Když jsem programem uložil "body", tak jsem obdržel toto a nic víc:"System.Win­dows.Forms.HtmlE­lement". Zatím nechápu na základě čeho to browser zoobrazí a jak se tady vyvolá dálší akce, i kdyby to byl script tak něco jej musí spustit.
Pro zajímavost si mužeš zkusit "http://www.a­dolor.cz/admin"
Pokuď mne někdo víc vzdělá budu vděčen.
Ď

 
Nahoru Odpovědět
6.11.2016 7:47
Avatar
Odpovídá na Petr Vocel
Neaktivní uživatel:6.11.2016 20:16

Na tom odkaze se ale používá kontrola přístupu pomocí htaccess, proto se logicky nenajde žádný element jelikož se žádné html generování ani nekoná dokud není správně vyplněné a odeslané přihlášení.
V takovém případě je potřeba poslat autentikaci už v http hlavičce.

Řešení by mohlo vypadat následovně:

private void button1_Click(object sender, EventArgs e)
 {
     byte[] authData = Encoding.UTF8.GetBytes("jmeno:supertajneheslo");
     string authHeader = "Authorization: Basic " + Convert.ToBase64String(authData) + "\r\n";
     webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LogIn);
     webBrowser1.Navigate("http://neco.cz", "", null, authHeader);
 }

 private void LogIn(object sender, WebBrowserDocumentCompletedEventArgs e)
 {
     WebBrowser webBrowser = (WebBrowser)sender;

    // Zpracování po načtení celé stránky
 }
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
6.11.2016 20:16
Neaktivní uživatelský účet
Avatar
Petr Vocel
Tvůrce
Avatar
Petr Vocel:7.11.2016 10:50

Jsi borec. Vyřešeno.
Víš já jsem hodně starý vlk a programuji asi déle, než ty žiješ. Dřív byl větší problém to "vyřešit" dnes je spíš problém jak spustit to co je vyřešeno.
Stejně ale nechápu na základě čeho vygeneruje webbrouser to okno, kam bych měl ručně vložit "logon" a "password". To musí mít na to každý prohlížeč kromě "html" souborů i "odbočku" pro případy htaccess nebo něco podobného. Je to tak ?
Jinak moc díky. Hodně jsem se přiučil a získal podněty k tomu co se mám ještě trochu doučit.

 
Nahoru Odpovědět
7.11.2016 10:50
Avatar
krepsy3
Tvůrce
Avatar
Odpovídá na Petr Vocel
krepsy3:7.11.2016 16:47

Tak já jen nekousavě starého vlka poučím, že je slušnost označit zde řešení. Stačí kliknout na tu modrou fajfku co se objeví vedle příspěvku když na něj najedeš myší ;)

Nahoru Odpovědět
7.11.2016 16:47
Programátor je stroj k převodu kávy na kód.
Avatar
Petr Vocel
Tvůrce
Avatar
Odpovídá na krepsy3
Petr Vocel:7.11.2016 18:53

Promiň asi jsem clikl na nesprávné místo, mělo to být asi na tvou odpověď a ne na mé poděkování.
Dík.

 
Nahoru Odpovědět
7.11.2016 18:53
Avatar
Odpovídá na Petr Vocel
Neaktivní uživatel:8.11.2016 11:36

Rád sem pomohl.

S tím prohlížečem se to má nějak tak že html, css, js jsou jazyky jež prohlížeči popíší co a jak se má vykreslit a provést na zobrazovaném dokumentu (www stránce), nicméně prohlížeč musí umět také tato data nějakým způsobem dostat od serveru, to znamená, že musí umět komunikovat pomocí nějakého protokolu se samotným serverem a samozřejmě i reagovat na požadavky serveru.
V tomhle případě je to http protokol a prohlížeč reaguje na http kódy, konkrétně na kód 401 Authorization Required, vyžádáním přihlašovacích údajů od uživatele. Přihlašovací dialog co se zobrazí není součástí webové stránky, ale je to programový dialog (je součástí uživatelského rozhraní prohlížeče).

Komunikace je asi následující (hodně zjednodušeně):

  1. prohlížeč -> server : "Pošli mi stránku XX"
  2. server -> prohlížeč : "Požaduješ stránku XX, která vyžaduje autorizaci, kód 401"
  3. prohlížeč -> uživatel : "Požadovaná stránka XX vyžaduje přihlášení, zadejte prosím jméno a heslo" (tady právě prohlížeč vyhodí to přihlašovací okno, jako reakci na http kód 401)
  4. uživatel -> prohlížeč : "Jméno je Karel, heslo je supertajneheslo"
  5. prohlížeč -> server : "Pošli mi stránku XX, autorizační údaje jsou Karel:supertaj­neheslo"
  6. server -> prohlížeč : "Autorizace je v pořádku, kód 200, tady máš stránku XX" (zároveň s http hlavičkou a kódem 200 OK se odesílá i obsah odemčené html stránky)

V programu z předchozího postu vycházíme z toho, že známe adresu dokumentu/stránky a víme předem, že vyžaduje přihlášení, proto můžeme přeskočit úvodní http komunikaci (body 1 a 2) , potlačit interakci s uživatelem (body 3 a 4) a přejít rovnou k bodu 5, kdy už posíláme požadavek na dokument včetně autorizace.

Program se dá pak samozřejmě upravit tak, že pokud nedostane od serveru http hlavičku 401, počká na událost DocumentCompleted, vyhledá ve stránce elementy přihlašovacího formuláře, ty vyplní a odešle formulář tak jak sem ukazoval v prvním kódu. Tím bude možnost využít oba způsoby přihlášení.

Nahoru Odpovědět
8.11.2016 11:36
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.