Newsgroup: it.comp.lang.visual-basic
Titolo: Interazione con WebBrowser e DOM

Come da oggetto, sto scrivendo una delle mie taaaaaaaante applicazioni
che interagiscono con un WebBrowser integrato.
Nel dettaglio, avevo il desiderio di creare una particolare funzione:
Function TrovaOggetto(TipoOggetto As String, TipoProprietà As String,
ValoreProprietà As String) As Long
il cui compito è quello di andare alla ricerca di un oggetto nella
pagina html caricata.
Dovrebbe (teoricamente) cercare un oggetto il cui tag sia quello
specificato nel parametro TipoOggetto, che possieda una proprietà
indicata in "TipoProprietà" e il cui valore (della suddetta
proprietà) sia quello indicato in "ValoreProprietà".
Per esempio, voglio cercare un oggetto INPUT, con proprietà "CLASS"
che sia "MiaClasse".
Cioè dirmi se esiste o meno un oggetto del tipo:
<input type="text" class="MiaClasse" />
Il problema dov'è?
Come faccio a vedere se esiste la proprietà "Class", se questa è
specificata in una variabile?
Cioè io in genere faccio:
Dim TagName As String
  TagName = UCase$(Browser.Document.All(iOggetto).TagName)
  If TagName = TipoOggetto Then
  ...
  End If
E fin qui nessun problema.
Se voglio controllare che la proprietà Class sia di un certo tipo,
controllo con:
  If Browser.Document.All(iOggetto).class = "unacertaclasse" Then
  ...
  End If
Ma come posso controllare se il parametro "class" esiste (o se è
valorizzato) se la stringa "class" si trova in una mia variabile?
Questo mi servirebbe per fare in modo da poter anche cercare anche per
altre proprietà non stabilite a priori. Per esempio potrei richiamare
questa mia funzione per ricercare oggetti di tipo "font" che abbiano
"size" con valore "10", solo per fare un esempio...
Spero di essermi spiegato chiaramente, e ringrazio anticipatamente chi
riuscirà a tirarmi fuori da questo guazzabuglio.

Forse mi sfugge qualcosa, ma con quasiasi browser se apri una pagina
questa viene valorizzata lato Client dopo essere stata elaborata lato
Server, quindi
non avrai mai una variabile non valorizzata.
Forse usi il controllo WebBrowser in un modo differente...?
In ogni caso passando per IIS potresti emulare la funzione del
Server...?
Sicuramente ho frainteso qualcosa....
@Alex

Il mio problema era: ho un'applicazione che sto sviluppando in VB6.
In questa applicazione, in un dato form, ho integrato un oggetto
webbrowser (che chiamo "Browser"), che carica delle pagine e, una volta
caricate, quando ho il documento completamente disponibile lato client,
voglio eseguire certe operazioni su di esso.
Ora, nella mia applicazione, in una certa mia funzione, ho delle
variabili:
Dim strTipoOggetto As String
Dim strNomeProprieta As String
Dim strValoreProprieta As String
Ad un certo punto, assumiamo che succeda una cosa tipo:
strTipoOggetto = "td"
strNomeProprieta = "id"
strValoreProprieta = "main"
Cioè voglio cercare nel documento del webbrowser integrato
nell'applicazione un oggetto che sia un "td" (cioè una cella), che
abbia la proprietà "id", e che questa proprietà valga "main".
Cioè voglio vedere se esiste un oggetto di tipo:
<td id="main" .... >blablabla</td>
Il problema è: da vb, quando interagisco con l'oggetto browser, come
faccio a controllare che una certa proprietà, come per esempio "id"
(non nota a priori perchè ce l'ho in una variabile di vb) esista e
abbia valore "main" (anche questo, contenuto in una variabile di vb)?
Cioè se il codice vb lo stessi scrivendo per cercare "sicuramente" un
oggetto che abbia id = "main" allora potrei testare di volta in volta,
per ogni oggetto che trovo nel documento html, con un if del genere:
If Browser.Document.All(i).id = "main" Then
  'Trovato
Else
  i = i + 1
  if i = Browser.Document.All.Length Then
    'Fine del ciclo...
  End If
End If
Ma il problema è che non so a priori "quale" proprietà dell'oggetto
devo cercare.
Il nome della proprietà (per esempio "id") ce l'ho in una variabile di
VB.
E se la variabile per esempio si chiama strNomeProprieta, non posso
scrivere:
If Browser.Document.All(i).strNomeProprieta = "main"
perchè cercherei proprio una proprietà di nome "strNomeProprieta"
piuttosto che "id", che è il valore della variabile strNomeProprieta.
Questo è il problema. Anzi ERA. Perchè stamattina scandagliando msdn
ho trovato il metodo (o la funzione?) getAttribute(strAttributeName)
che, applicato ad un oggetto qualsiasi del documento html, mi cerca
l'attributo indicato tra parentesi e mi restituisce il suo valore (se
esiste, ovviamente, altrimenti restituisce NULL).
E quindi ho risolto.
Ora posso cercare un attributo "generico" in questo modo:
If Browser.Document.All(i).getAttribute(strNomeProprieta) =
strValoreProprieta Then
  'Trovato l'oggetto
Else
  [snip]
End If
Spero di essermi spiegato meglio, e che questo post possa aiutare chi
smanetta con il DOM :D

Ora sei stato chiarissimo, ma probabilmente anche prima era chiaro
se avessi seguito meglio la genesi...!
Hai provato così:
If Browser.Document.All(strNomeProprieta).GetAttribute("value")  =
strValoreProprieta Then 
Ciao
@Alex

Era una domanda la tua? :)
Perchè in effetti nel post precedente ho detto di aver risolto proprio
così :D
Ho "scoperto" GetAttribute() e l'ho usato in quel modo, appunto.
Infatti ora ho una mia bella funzione:
CercaOggetto(TipoOggetto, NomeProprieta, ValoreProprieta) As Long
che restituisce -1 nel caso la ricerca fallisca, oppure l'indice
dell'oggetto nella pagina.
E devo dire che è di un'utilità estrema :D

Era una domanda la tua? :)
Perchè in effetti nel post precedente ho detto di aver risolto proprio
così :D
[Risposta]
No che non era una domanda ma ti assicuro che non avevo visto la parte
finale
del tuo post....!
Mi fa piacere averci preso significa che qualcosa mi ricordo
ancora...!!
Meglio così.
@Alex

Cmq non l'hai azzeccata :D :D :D
Perchè tu hai suggerito:
Document.All(strNomeProprieta).getAttribute("valore") =
strValoreProprieta
mentre la versione corretta è:
Document.All(i).getAttribute(strNomeProprieta) = strValoreProprieta
Yuk!

Forse ho sbagliato nel senso che è per il NET Framework, ma
non è sbagliata.
Dai un'occhiata quì:
http://msdn2.microsoft.com/en-US/library/system.windows.forms.webbrowser.document.aspx
Ciao
@Alex

Vabè si sintatticamente è corretta, ma non è corretto l'uso,
perchè:
1) Browser.Document.All(strNomeProprieta)...
e in questo modo cerco un oggetto che si "chiami" con il contenuto di
strNomeProprietà.
Quindi se strNomeProprietà = "href", cioè se cerco un oggetto di cui
voglio controllare il valore della proprietà "href", in questo modo
cercherò un oggetto che sia dichiarato con name="href". E non è
corretto.
2) .getAttribute("value") restituisce il valore della proprietà
"value" di un oggetto, tipo gli input.
Ma io non voglio la proprietà value, quanto piuttosto la proprietà
indicata nella variabile strNomeProprietà.
Ecco perchè è errato il frammento di codice che mi avevi postato...

 
Guarda tra i riferimenti MIcrosoft Html Object Library.

1)
Mi pare opinabile in fondo è la
stessa Microsoft che conferma quanto ti ho segnalato, è pur
vero che MS qualche volta dice cose opinabili, ma a mio avviso
in questo caso è corretto, tuttavia posso concordare con te che
la sintassi usata da te sia più precisa.
2) Value è passato come stringa, mi sembrava scontato non doverti
esplicitare che era sostituibile, ci arrivava anche uno che non ha mai
aperto VB, e tu di certo non sei fra questi...!!!
Saluti
@Alex