Ovládaní IE z VB.net   otázka

VB.NET

Chtěl bych se zeptat, jestli se dají automaticky doplňovat data do formulářů na nějaké stránce otevřené v IE ? Řekněme, že mám nějakou posloupnost údajů, kterou musím na určitých stránkách každodenně vyplňovat a chtěl bych tento manuální proces zefektivnit pomocí automatického doplňování. Proces by probíhal tak, že bych si pomocí kódu otevřel příslušnou stránku a tam formou simulací stisku kláves (TAB, ENTER, CTRL+C, CTRL+V) bych postupně vyplňoval údaje pomocí dat z nějaké DB či tabulky. Můžete mě "nakopnout" správným směrem ? A pokud je to možné, lze v IE identifikovat jednotlivé controls ?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud to je standalone prohlížeč, tak asi jako nejjednodušší cestu bych viděl napsat si nějaký plugin do IE (jde to i v .NETu), kterému pošlete instrukce a on stránku vyplní. Mají na to COM rozhraní, které umí prakticky vše, co byste mohl potřebovat.

Pokud je to komponenta WebBrowser ve formuláři, tak tu můžete ovládat pomocí jejích různých funkcí, nedávno se to zde ve fóru řešilo.

Btw není lepší koupit si za pár korun Roboform?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Koukal jsem na ten RoboForm ale na to co potřebuji je absolutně nevhodný.

Abych přiznal, tak mám k dispozici nástroj na běžné vyplňování formulářů "RMA macro". Horší je, že mám k dipozici jen zkompilovaný spouštěcí soubor, který se odkazuje na script. Ani už nevím jak jsem se k němu dostal, ale tento exáč používáme již dva roky. Licence bude jen na straně tvůrce, což je náš zákazník. Takže mohu pracovat pouze s tím co je ve scriptu. Např. umí si načíst z excelu tabulku a hodnoty pak předávat do polí stránek.

K identifikaci polí používá, souřadnice obrazovky nebo porovnáním obrázku např. tlačítka a nebo se k prvku dostane pomocí simulací kliku kláves. Umí dokonce pracovat s IF THEN ELSE a cykly.

Jenže tohle vše funguje na předem daný resp. známý počet prvků. Tzn. vím, že se jedná o jednu zakázku, která bude obsahovat jasně stanovený počet informací k vyplnění.

Teď ale potřebuji, aby ten script vyplňoval tabulku kde předem není znám počet záznamů. Tzn., že potřebuji identifikovat, zda se při dalším posunu pomocí TAB dostane kurzor na další záznam nebo zda skočí na button "Save". K tomu ale potřebuji zpětnou vazbu od prohlížeče. A to jsem v dostupném scriptu nenalezl.

Možná si řeknete, proč identifikovat pole, když by se dal využít cyklus procházení vztažných prvků uložených v excelu a po jejím ukončení ukončit i vyplňování ? Jenže v tomto případě je to tak, že si potřebuji doplnit v každém záznamu jen jeden určitý údaj který naleznu v excelovské tabulce, takže cyklus tady nepomůže.

Proto uvažuji jestli by pro řešení nebylo jednodušší si tu aplikaci napsat ve VB.net než nadále hledat možnosti toho scriptu. Vím, že simulace stisku kláves asi nebude problém a něco o tom najdu i tady, ale mě by v prní řadě zajímalo, jestli existuje možnost pro "amaterského lovce kódu", tedy mě, lehce identifikovat na kterém controls se na stránce s kurzorem právě nálezám, případně zda jsem schopen načíst i jeho obsah.

Možná že už to rozebírám moc do podrobna, ale poraďte alespoň všeobecně.

Pro zajímovost posílám jak takový script vypadá

//Keyboard initialize
CapsOff
NumOff
ScrollOff
//End of keyboard initialize

//Counter initialize
Let>putaway_order_count=0
Let>error_order_count=0
Let>putaway_done_count=0
//End of counter initialize



//Check which line to start from in Excel file
Let>file_name=PA_Macro.xls
Let>initial_row=2
Repeat>col_c_value
DDERequest>Excel,file_name,R%initial_row%C3,col_c_value,30
StringReplace>col_c_value,CRLF,,col_c_value
Let>initial_row=initial_row+1
Until>col_c_value=
Let>starting_row=initial_row-1
//End of check which line to start from in Excel file



//Check if initial row is a null
Let>col_a_init_value=
DDERequest>Excel,file_name,R%starting_row%C1,col_a_init_value,30
StringReplace>col_a_init_value,CRLF,,col_a_init_value
If>col_a_init_value=
Goto>End_And_Show_Message
EndIf
//End of check if initial row is a null



//Process starts...

//Set focus to SeLECT window
SetFocus>SeLECT - Microsoft Internet Explorer
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\initialize.bmp,1
Wait>0.1
//End set focus to SeLECT window


//Repeat function to loop till end of Excel file
Repeat>col_a_value

//Error check initialize
Let>error_1=0
Let>error_2=0
Let>error_3=0
//End of error check initialize

//Search for order...

//First screen
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\inbound.bmp,SCREEN,1,1,XArr,YArr,inbound
If>inbound=1
MouseMove>XArr_0,YArr_0
LClick
EndIf
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_console.bmp,1
Wait>0.1
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\inbound_order_console.bmp,SCREEN,1,1,XArr,YArr,inbound_order_console
If>inbound_order_console=1
MouseMove>XArr_0,YArr_0
LClick
EndIf
Wait>0.5

//Second screen with refresh check
Let>refresh_check=0
Repeat>refresh_check
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\help.bmp,SCREEN,1,1,XArr,YArr,help
If>help=1
Let>refresh_check=0
Wait>0.1
EndIf
If>help=0
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order.bmp,1
Let>refresh_check=1
EndIf
Wait>0.1
Until>refresh_check=1

//Click on the order...
Wait>0.1
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=17
DDERequest>Excel,file_name,R%starting_row%C1,flowtag_value,30
StringReplace>flowtag_value,CRLF,,flowtag_value
Send Character/Text>%flowtag_value%
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=15
Wait>0.1
Press Right
Wait>0.1
Press Enter

//Third screen & iDoc error check
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_list.bmp,1
Wait>0.1
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\no_records_buttons.bmp,SCREEN,1,1,XArr,YArr,retrieved_records
If>retrieved_records=1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_list.bmp,1
Let>error_1=2
Goto>Record_Not_Found
Else
If>retrieved_records=0
Let>error_1=1
Goto>Record_Found
Else
MessageModal>Error!
Goto>The_End
EndIf
EndIf
//End of search for order


//If the order does not exist...
Label>Record_Not_Found
If>error_1=2
DDEPoke>Excel,file_name,R%starting_row%C3,Order Not Found
GetDate>today_date
GetTime>now_time
Let>this_moment=%today_date%, %now_time%
DDEPoke>Excel,file_name,R%starting_row%C4,this_moment
Let>error_order_count=error_order_count+1
GoTo>Go_To_Next_Row
EndIf
//End of if order does not exist

//If order exists...
Label>Record_Found
If>error_1=1
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=6
Press Enter


//If order exists check if receiving or putaway has already been done...
Label>inbound_screen_check
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_detail.bmp,1
Let>screen_check=0
Repeat>screen_check
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\receive_not_done.bmp,SCREEN,1,1,XArr,YArr,receive_not_done
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\receipt_done.bmp,SCREEN,1,1,XArr,YArr,receipt_done
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\put_away_done.bmp,SCREEN,1,1,XArr,YArr,put_away_done
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\receive.bmp,SCREEN,1,1,XArr,YArr,receive
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\receive_disabled.bmp,SCREEN,1,1,XArr,YArr,receive_disabled
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\put_away.bmp,SCREEN,1,1,XArr,YArr,put_away
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\put_away_disabled.bmp,SCREEN,1,1,XArr,YArr,put_away_disabled
If>{(%receive_not_done%=1) AND (%receive%=1) AND (%put_away_disabled%=1)}
Wait>0.1
Let>screen_check=1
Let>error_2=1
Let>error_3=1
Goto>Receipt_Not_Done
Else
If>{(%receipt_done%=1) AND (%receive_disabled%=1) AND (%put_away%=1)}
Wait>0.1
Let>screen_check=1
Let>error_2=2
Let>error_3=1
Goto>PutAway_Not_Done
Else
If>{(%put_away_done%=1) AND (%receive_disabled%=1) AND (%put_away_disabled%=1)}
Wait>0.1
Let>screen_check=1
Let>error_2=2
Let>error_3=2
Goto>PutAway_Done
Else
Let>screen_check=0
EndIf
EndIf
EndIf
Until>screen_check=1
//End of if order exists check if putaway has already been done


//If receive not done...
Label>Receipt_Not_Done
If>{(%error_2%=1) AND (%error_3%=1)}
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\receive.bmp,SCREEN,1,1,XArr,YArr,receive
If>receive=1
MouseMove>XArr_0,YArr_0
LClick
EndIf
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\receive_title.bmp,1
Wait>0.1
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=2
Press Enter
Let>error_2=0
Let>error_3=0
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_detail.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\receipt_done.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\receive_disabled.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\put_away.bmp,1
Goto>inbound_screen_check
EndIf
//End of if receive not done


//If putaway not done...
Label>PutAway_Not_Done
If>{(%error_2%=2) AND (%error_3%=1)}
Let>checkpoint_1=0
Let>checkpoint_2=0
Let>checkpoint_3=0
FindImagePos>C:\Macros\Receive & PutAway Macro\Images\put_away.bmp,SCREEN,1,1,XArr,YArr,put_away
If>put_away=1
MouseMove>XArr_0,YArr_0
LClick
EndIf
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\complete_tasks.bmp,1
Let>checkpoint_1=1
Wait>0.1
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=8
DDERequest>Excel,file_name,R%starting_row%C2,target_loc,30
Send Character/Text>%target_loc%
Let>press_tab=0
Repeat>press_tab
Press Tab
Let>press_tab=press_tab+1
Wait>0.1
Until>press_tab=3
Press Enter
Let>checkpoint_2=1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\inbound_order_detail.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\put_away_done.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\receive_disabled.bmp,1
WaitScreenImage>C:\Macros\Receive & PutAway Macro\Images\put_away_disabled.bmp,1
Wait>0.1
Let>checkpoint_3=1
If>{(%checkpoint_1%=1) AND (%checkpoint_2%=1) AND (%checkpoint_3%=1)}
DDEPoke>Excel,file_name,R%starting_row%C3,Completed
GetDate>today_date
GetTime>now_time
Let>this_moment=%today_date%, %now_time%
DDEPoke>Excel,file_name,R%starting_row%C4,this_moment
Let>putaway_order_count=putaway_order_count+1
Else
MessageModal>Error! PutAway Steps Were Not Completed!
Goto>End_And_Show_Message
EndIf
EndIf
EndIf
//End of if putaway not done


//If putaway has already been done...
Label>PutAway_Done
If>{(%error_2%=2) AND (%error_3%=2)}
DDEPoke>Excel,file_name,R%starting_row%C3,PutAway Already Done Previously
GetDate>today_date
GetTime>now_time
Let>this_moment=%today_date%, %now_time%
DDEPoke>Excel,file_name,R%starting_row%C4,this_moment
Let putaway_done_count=putaway_done_count+1
EndIf
//End of if putaway has already been done

EndIf
//End of if order exists


//Go to next row
Label>Go_To_Next_Row
Let>starting_row=starting_row+1
DDERequest>Excel,file_name,R%starting_row%C1,col_a_value,30
StringReplace>col_a_value,CRLF,,col_a_value
//End go to next row


//2nd error check initialize
Let>error_1=0
Let>error_2=0
Let>error_3=0
//End 2nd of error check initialize


Until>col_a_value=
//End of repeat function to loop till end of Excel file



//Display completion confirmation and details
Label>End_And_Show_Message
Let>MSG_STAYONTOP=1
Let>MSG_CENTERED=1
SetFocus>Microsoft Excel - PA_Macro.xls
Wait>3
Press CTRL
Send Character/Text>S
Release CTRL
Wait>0.5
MessageModal>Completed! %putaway_order_count% order(s) were put away successfully, %putaway_done_count% order(s) have already been put away & %error_order_count% order(s) could not be found.
//End of display confirmation and details



Label>The_End
//Done!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Psát modul plugin pro Explorer je zbytečně složité. Použijte WebBrowser a jeho vlastnost Document pro manipulaci s elementy HTML stránky. Pracuje se s tím stejně (dobře) jako s XmlDocumentem. Musíte ale znát elementy, ze kterých se skládá HTML stránka.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No záleží, jestli tazatel chce ovládat stand-alone IE, nebo WebBrowser uvnitř vlastního okna.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No, to je pravda. Ale pokud jde vyloženě o vyplnění formuláře, bude výsledek v obou případech stejný a v případě WebBrowseru jednodušší realizace.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji, zkusím to

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback