Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

09 Dec 2017, 10:46

Estou a fazer uma pequena aplicação para trabalhar na intranet da minha organização e, até agora, ainda não consegui levar essa aplicação a escolher um determinado item numa DropDownList nem inserir texto numa caixa de comentários/Texto.
Consigo identificar os dois elementos quer pelo nome quer pela tag mas a aplicação diz que são desconhecidos.
Trabalho numa página que é aberta a partir de uma selecção feita noutra página.
A nova página está dividida em três áreas diferentes. Poderá ser por não seleccionar, previamente, a área correcta?
Se sim, como direccionar para essa área?
Anexo alguns documentos para demonstração do acima dito.
Alguém me consegue ajudar? Serão necessários mais elementos explicativos?
Antecipadamente grato.

Manbat42
Attachments
DropDownBox iWB2.png
DropDownBox iWB2.png (228.21 KiB) Viewed 5351 times
TEXTAREA Prtscr.png
TEXTAREA Prtscr.png (222.48 KiB) Viewed 5351 times
GPS_Arquivo.ahk
(4.96 KiB) Downloaded 114 times
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

11 Dec 2017, 09:23

Olá manbat42.

Não consegui acessar o código fonte da página em questão, então vou lhe mostrar um exemplo de solução para uma questão parecida perguntada algum tempo atrás por outro usuário em https://autohotkey.com/board/topic/1091 ... down-item/.

A pergunta original era:
:arrow: Como selecionar o país "Canada" na DropDown "Country" nesta página:
https://www.myhuskyrewards.ca/ProfileMa ... ardNumber=

O código que responde a pergunta (como selecionar o item da dropdown) daquele usuário é esse:

Code: Select all

wb := ComObjCreate("InternetExplorer.Application") ;// Create an IE object
wb.Visible := true ;// Make the IE object visible  set to 'false' to keep hidden
wb.Navigate("https://www.myhuskyrewards.ca/ProfileMain.aspx?CardNumber=") ;// Navigate to a webpage 
While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy ; wait for the page to load
   Sleep, 10
 
wb.document.all.ctl00_MainContent_selectTitleDropdown.value := "Mr"
wb.document.all.ctl00_MainContent_selectCountryDropDownList.value := "CA"
wb.document.getElementById("ctl00_MainContent_selectCountryDropDownList").value := "CA"
wb.document.all.ctl00_MainContent_selectProvinceDropdown.value := "Alberta"
return
Para descobrir que o valor correto na seleção deveria ser "CA" e não "Canada" só precisei olhar o código fonte da página. Veja que o método utilizado para selecionar o item na DropDown já era conhecido pelo usuário e talvez ele sirva no seu caso também.

Code: Select all

<div class="floatLeft left"><span>Country</span>:</div>
								            <div class="floatLeft right"><select name="ctl00$MainContent$selectCountryDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$selectCountryDropDownList\',\'\')', 0)" id="ctl00_MainContent_selectCountryDropDownList">
			<option selected="selected" value=""></option>
			<option value="CA">Canada</option>
			<option value="US">USA</option>
Caso não funcione, por favor poste a parte do código fonte da página que contém os dados da DropDown.

:thumbup:
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

12 Dec 2017, 05:36

Olá Gio
Muito obrigado pela rápida resposta.
Envio, em anexo o Código da página WEB (Workplace Aprovação do passo.txt) e o meu script (GPS_Arquivo.ahk) elaborado até agora, O meu problema actual está nas linhas 129 a 132 do script.
O código da página que identifica os elementos que pretendo alterar/Preencher está nas linhas 298 ("STEP_RESPONSES") e 303 ("STEP_COMMENT").
Como estamos a falar de um frame, suponho que teria que identificar toda a árvore, mas não sei como...

Antecipadamente grato pela ajuda prestada e disponibilidade demonstrada.

Manbat42
Attachments
Workplace Aprovação do passo.txt
(145.43 KiB) Downloaded 143 times
GPS_Arquivo.ahk
(5.84 KiB) Downloaded 111 times
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

12 Dec 2017, 09:12

Ok, tomando por base o arquivo que você me enviou (Workplace Aprovação do passo.txt), fiz o seguinte teste: coloquei ele na área de trabalho, depois renomeei ele como workplace.htm e executei o seguinte código para selecionar uma entrada na DropDownList:

Code: Select all

wb := ComObjCreate("InternetExplorer.Application") ; Essa linha cria um objeto do Internet Explorer.
wb.Visible := true ; Essa linha torna o objeto visível.
wb.Navigate("C:\Users\" . A_UserName . "\Desktop\workplace.htm") ; Navega para uma página (no meu caso um arquivo local). Coloque aqui a URL correta no seu caso.
While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy ; Espera a página carregar.
   Sleep, 10
 
wb.document.all.STEP_RESPONSES[4].setAttribute("selected", "selected") ; E essa linha finalmente é a que seleciona a quarta entrada na DropDown. Mude o número para selecionar outra. Veja que a página já deve estar totalmente carregada quando esta linha for chamada (o que foi garantido com o while acima).
return
Veja que o script espera a página terminar totalmente de carregar antes de selecionar a entrada na DropDown (isso pode demorar uma pouco).
nem inserir texto numa caixa de comentários/Texto.
O comando para inserir texto na caixa de texto é bem parecido. Eu adicionei a linha respectiva no código abaixo, de modo que se você seguir os mesmos passos, tanto a seleção da dropdown aconteça quanto um texto seja inserido na caixa.

Code: Select all

wb := ComObjCreate("InternetExplorer.Application") ; Essa linha cria um objeto do Internet Explorer.
wb.Visible := true ; Essa linha torna o objeto visível.
wb.Navigate("C:\Users\" . A_UserName . "\Desktop\workplace.htm") ; Navega para uma página (nesse caso um arquivo local).
While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy ; Espera a página carregar.
   Sleep, 10
 
wb.document.all.STEP_RESPONSES[4].setAttribute("selected", "selected") ; E essa linha finalmente é a que seleciona a quarta entrada na DropDown. Mude o número para selecionar outra. Veja que a página já deve estar totalmente carregada quando esta linha for chamada (o que foi garantido com o while acima).

wb.document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script." ; Essa linha é a responsável por escrever o texto na caixa. Veja que ela também requer que a página esteja totalmente carregada antes de ser executada.
return
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

12 Dec 2017, 11:35

Olá Gio

Uma vez mais, muito obrigado pela resposta pronta e clarificadora.
Infelizmente, como demonstram os anexos, não resolveu.
Eu suponho que tem a ver com o facto de a página ser um frame criado por uma página anterior. Envio uma imagem da página origem. O que faz "nascer" a página do frame é o clicar no texto "Tratamento do documento" identificado no script como "pwb.document.all.tags("A")[41].Click()".
Envio também um documento com os elementos recolhidos com a aplicação "IE HTML Element Spy". Não sei se ajuda...
Devo referir que se trata de uma aplicação a rodar numa intranet e, portanto, sem acesso do exterior da organização.

Cordiais saudações
Attachments

[The extension docx has been deactivated and can no longer be displayed.]

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

13 Dec 2017, 09:33

manbat42 wrote:Eu suponho que tem a ver com o facto de a página ser um frame criado por uma página anterior. Envio uma imagem da página origem. O que faz "nascer" a página do frame é o clicar no texto "Tratamento do documento" identificado no script como "pwb.document.all.tags("A")[41].Click()".
Eu testei aquele código com uma página que possuía somente o html enviado e funcionou, então, realmente deve ter algo a mais no caso real que temos que levar em conta. Em relação ao fato de ser uma página com frames, eu dei uma olhada em alguns tópicos antigos e realmente parece que o código muda um pouco. Em primeiro lugar, é preciso encontrar o número do frame em questão (que pelas fotos parece ser o 1, mas pode ser que seja outro). Depois, devemos utilizar a propriedade parentWindow para criar uma conexão com este frame.

Então essa linha:
pwb.document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script."

Viraria algo como isso:

Code: Select all

frames := pwb.document.parentwindow.frames
frames[1].document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script."
E se funcionar, o mesmo deve ser feito à linha que escolhe a entrada na DropDown.

Referências de outros tópicos para consulta:
https://autohotkey.com/board/topic/4705 ... ntry599965
https://autohotkey.com/board/topic/8549 ... avascript/
https://autohotkey.com/boards/viewtopic.php?t=8266
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

14 Dec 2017, 16:39

Olá Gio

Ainda não funcionou. Tenho andado a fazer pesquisas na net e ao utilizar uma ferramenta do iWB2_Learner encontrei a árvore do elemento que pretendo aceder e alterar. Envio imagem.

A parte do código em que tenho problemas é esta:
_________________________________________________________________________________________
TratamentoDocumento:

pwb.document.all.tags("A")[41].Click()
Sleep 100

While ( Pwb.Busy || Pwb.ReadyState != 4 ) ; Waits for the webpage to finish loading
Sleep 10

WinWait, Workplace: Processador de passos,
IfWinNotActive, Workplace: Processador de passos, , WinActivate, Workplace: Processador de passos,
WinWaitActive, Workplace: Processador de passos,
WinMaximize, Workplace: Processador de passos
Sleep 100

While pwb.readyState != 4 || pwb.document.readyState != "complete" || pwb.busy ; wait for the page to load
Sleep, 10

pwb := IEGET()
pwb.visible := true
While pwb.readyState != 4 || pwb.document.readyState != "complete" || pwb.busy ; wait for the page to load
Sleep, 10

tamanho := pwb.document.frames.length

MsgBox % tamanho ;Aqui recebo a indicação de que são três os frame

; Até este passo, funciona perfeito. Apenas não consigo aceder os elementos aqui elencados...

;pwb.document.all.STEP_RESPONSES[5].setAttribute("selected", "selected") ; E essa linha finalmente é a que seleciona a quarta entrada na DropDown. Mude o número para selecionar outra. Veja que a página já deve estar totalmente carregada quando esta linha for chamada (o que foi garantido com o while acima).

;pwb.document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script." ; Essa linha é a responsável por escrever o texto na caixa. Veja que ela também requer que a página esteja totalmente carregada antes de ser executada.

Pwb.document.forms[0].getElementsByName("STEP_RESPONSES")[0].value := 5 ;As duas linhas de código acima, não funcionam. Esta linhya não dá erro, mas não tem qualquer efeito. Se alterar Forms por Frames, não dánada. Não consigo descobrir mais nada...

;pwb.document.getElementsByTagName("TEXTAREA")[0].value := "Resposta recolhida no SIPE"

MsgBox % "Valeu?" ;Apenas para parar o script...

WinKill, Área de Trabalho
WinKill, Workplace: Processador de passos

ExitApp

______________________________________________________________________
Attachments
GPS_Arquivo.ahk
(7.5 KiB) Downloaded 112 times
Accessing SELECT.png
Accessing SELECT.png (231.78 KiB) Viewed 5351 times
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

14 Dec 2017, 17:00

tamanho := pwb.document.frames.length

MsgBox % tamanho ;Aqui recebo a indicação de que são três os frame
Bom, se foi possível verificar o número de frames, já temos algum avanço, pois sabemos agora que pwb.document.frames acessa corretamente os frames e é uma sintaxe correta.
Eu tinha pensado que frame.# no iwb significava o número do frame que temos que acessar, mas parece que não é bem isso, de acordo com este post do Jethrow. Então, já que são somente 3 frames, o que eu sugiro a seguir é tentar todos os três para ver em qual se situa o elemento STEP_COMMENT, por exemplo. No código abaixo eu coloquei três linhas para teste, se ocorrer um erro na linha que referencia frames[1] em busca de STEP_COMMENT por exemplo, basta tirar ela e tentar com a linha que referencia frames[2]. E depois com o frames[3].

Code: Select all

TratamentoDocumento:

pwb.document.all.tags("A")[41].Click()
Sleep 100

While ( Pwb.Busy || Pwb.ReadyState != 4 ) ; Waits for the webpage to finish loading
Sleep 10

WinWait, Workplace: Processador de passos,
IfWinNotActive, Workplace: Processador de passos, , WinActivate, Workplace: Processador de passos,
WinWaitActive, Workplace: Processador de passos,
WinMaximize, Workplace: Processador de passos
Sleep 100

While pwb.readyState != 4 || pwb.document.readyState != "complete" || pwb.busy ; wait for the page to load
Sleep, 10

pwb := IEGET()
pwb.visible := true
While pwb.readyState != 4 || pwb.document.readyState != "complete" || pwb.busy ; wait for the page to load
Sleep, 10

tamanho := pwb.document.frames.length

MsgBox % tamanho ;Aqui recebo a indicação de que são três os frame

; Até este passo, funciona perfeito. Apenas não consigo aceder os elementos aqui elencados...

frames := pwb.document.parentwindow.frames

frames[1].document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script."
frames[2].document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script."
frames[3].document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script."

MsgBox % "Valeu?" ;Apenas para parar o script...

WinKill, Área de Trabalho
WinKill, Workplace: Processador de passos

ExitApp
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 07:30

Olá Gio

Descobri este post ( https://autohotkey.com/boards/viewtopic.php?t=8266 ) mas, mesmo assim, não estou a conseguir. Será que alguma coisa me está a escapar?
Pode dar uma ajuda, tendo em atenção tudo o que foi dito e postado anteriormente sobre o meu tópico?

Obrigado, mais uma vez.

Manbat42
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 10:57

Será que alguma coisa me está a escapar?
Provalvemente tem alguma coisa no código da página principal que não está sendo considerada ainda. Temos que ajustar o código para que possa trabalhar com esta situação específica do caso. O Html que você enviou em "workplace aprovação do passo.txt" parece ser somente relativo ao do frame em questão. Tem como você enviar o Html da página principal (a que abre o frame)?
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 12:41

Como já deu para ver, os meus conhecimentos informáticos não são de expert. Espero que o solicitado seja o que vai em anexo. Se não for, continuaremos a tentar.

Obrigado.

Manbat42
Attachments
Área de Trabalho.7z
(12.75 KiB) Downloaded 126 times
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 12:44

Faltava-me esclarecer que o objecto (link) que está em causa é o wcmListViewLink
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 14:05

Ok, vamos tentar o seguinte:

Execute o script abaixo, depois abra a página "Tratamento do Documento" (a que tem o DropDown) no InternetExplorer, espere carregar totalmente e enquanto o script estiver em execução e a página estiver aberta pressione F2.

Code: Select all

F2::
TabName := "Workplace: Aprovação do passo"
wb2 := WBGet(TabName)
While wb2.readyState != 4 || wb2.document.readyState != "complete" || wb2.busy ; Espera a página carregar.
   Sleep, 10
 
wb2.document.all.STEP_RESPONSES[4].setAttribute("selected", "selected") ; E essa linha finalmente é a que seleciona a quarta entrada na DropDown. Mude o número para selecionar outra. Veja que a página já deve estar totalmente carregada quando esta linha for chamada (o que foi garantido com o while acima).

wb2.document.all.STEP_COMMENT.value := "Este texto foi escrito pelo script." ; Essa linha é a responsável por escrever o texto na caixa. Veja que ela também requer que a página esteja totalmente carregada antes de ser executada.
Return

WBGet(WinTitle="ahk_class IEFrame", Svr#=1) { ; based on ComObjQuery docs
   static   msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
   ,   IID := "{0002DF05-0000-0000-C000-000000000046}" ; IID_IWebBrowserApp
;   ,   IID := "{332C4427-26CB-11D0-B483-00C04FD90119}" ; IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}
Acontece algo? O Código consegue selecionar a entrada 4 e preencher a caixa de texto?
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

18 Dec 2017, 19:10

Oi Gio

Neste momento estou em minha casa e tenho um ambiente web diferente, com links diferentes pelo que não dá para experimentar.
Amanhã, não sei se terei tempo para tentar a solução proposta.
Depois digo alguma coisa.

Obrigado pelo apoio e enorme interesse demonstrado.

Manbat42
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

20 Dec 2017, 06:14

Olá Gio

Ainda não funciona.
Ainda que tenha a indicação de que existem de três frames, na "Estrutura Pai" obtida pelo iWB2 Lerner, não aparece nenhum frame mas sim um form. Será por aí?
Já não sei mais o que fazer para "entrar" na página a fim de aceder aos diversos elementos nela existentes.
Mais alguma ideia?

Manbat42
Attachments
Estrutura Pai.png
Estrutura Pai.png (215.97 KiB) Viewed 5351 times
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

22 Dec 2017, 09:53

Bom dia Manbat42.

Infelizmente não tenho mais nenhuma ideia no momento. Pelo que vi no último html que você enviou acredito que o servidor cria uma nova página "mãe" quando você clica em "Tratamento do Documento", de modo que pode haver mais algum código entre as páginas. Mas tendo em vista as particularidades do caso em questão e o fato de que se trata de um sistema em intranet (ao qual não tenho acesso para fazer testes), a melhor opção no momento seja levar a pergunta ao fórum em inglês. Talvez alguém tenha alguma ideia por lá sem precisar acessar o ambiente para estudá-lo (isso pode acelerar o solucionamento da questão).

Você quer que eu crie um tópico lá explicando a situação, o que já tentamos e o que queremos fazer?
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

26 Dec 2017, 14:07

Olá Gio

Isso seria óptimo, pois quantos mais cérebros se dedicarem a um assunto, maiores probabilidades de sair uma solução...
Entretanto devo acrescentar que contactei um professor de informática de uma universidade aqui de Portugal e ele também está a estudar o assunto. Pode swer que, entre todos, consigamos uma solução.
Se/quando tiver uma solução, colocarei aqui por me parecer interessante partilhar. Quem sabe possa ajudar outros.

Manbat42
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

17 Jan 2018, 17:28

Oi Gio

Chegou a colocar a questão no forum inglês? :?:
Ainda estou à espera do contacto do professor de informática... disse que esta semana me contactava. Veremos...
Será que haveria alguma hipótese de aproveitar o código da página e lançar alguma função existente que seja chamada pelo "onclick"? :problem:
Questões para quem percebe de javascript... que não é o meu caso.
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

17 Jan 2018, 18:15

Olá Manbat42.

Coloquei sim (link), mas infelizmente não obtive resposta. Creio que a resposta para a questão continua escondida em algum código de página. Pelo que vi o html da página principal parece não ter nenhuma relação com o html do frame aprovação do passo. Tudo o que ele faz é mandar um comando ao servidor. Acredito que quando o comando de abrir a tela da aprovação do passo é enviado ao servidor pela página principal apresentada, o servidor devolva um novo html mãe junto com o html da aprovação do passo, como se fosse uma nova tela mãe com o frame filho dentro. Se for esta a situação, talvez seja lá que esteja o nome do elemento que temos que acessar para realizar a conexão com o frame desejado.
manbat42
Posts: 22
Joined: 04 Nov 2017, 11:25

Re: Aceder item em DropDownBox ("SELECT") e Caixa de TEXTO ("TEXTAREA")

25 Jan 2018, 17:46

Olá Gio.

Muito obrigado pelo apoio e toda a preocupação demonstrada. Infelizmente, ainda estou à espera da ajuda do professor universitário de que falei anteriormente. Parece demasiado ocupado e ainda não conseguiu encontrar um espaço para nos reunirmos. Veremos se alguma coisa roda.
Continuo a, de vez en quando, experimentar mais algumas ideias, mas sem resultado.
A esperança é sempre a última a morrer e, por isso, estou esperançado numa "eureka" qualquer dia.
Obviamente que darei notícias, se as tiver.
Fique bem!

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 22 guests