Risolto Voltare pagina con selenium.

Luigi14

Utente abituale
Original poster
3 Aprile 2023
478
48
30
2019
Ciao, rieccomi con l'ennesimo quesito su selenium.
Il problema è che vorrei prendere visione di una serie di pagine , per la precisione da 1 a 14 , ora ho spolverato una vecchia impostazione di qualche anno fa trovata qui sul forum, ma continua a presentare solo la prima pagina e non anche le successive. Dove sbaglio ?
aggiungo Html e miei tentativi



miei tentativi :
1 ) ripete sempre la prima pagina , ed è molto lento .
Visual Basic:
        'scarica tutte le pagine
        For i = 1 To 14  'n. pagine

            Set table = Dd.FindElementByCss("#tableResults")

            ' Itera sulle righe della tabella By forumexcel
            For Each row In table.FindElementsByTag("tr")
                c = 1
                ' Itera sulle celle (td o th)
                For Each cell In row.FindElementsByTag("td")
                    Cells(r, c).Value = cell.Text
                    c = c + 1
                Next cell
                r = r + 1
            Next row

            ' On Error Resume Next    ' Gestione errore se non trova il pulsante
            Dim ul As Object, li As Object

            Set ul = Dd.FindElementByCss(".m-pagination__nav")
            For Each li In ul.FindElementsByCss("li")
                If li.FindElementByCss("a").Attribute("title") = "next" Then
                    li.Click
                    Exit For
                End If    '   On Error GoTo 0

                Dd.Wait 1000    ' Pausa per il caricamento

                r = Cells(Rows.Count, 1).End(xlUp).row - 1
            Next li
            Next
        End With

2) Questo codice ripete per 14 volte la stessa pagina (prima)
'scarica tutte le pagine

Visual Basic:
For i = 1 To 14  'n. pagine



            Set table = Dd.FindElementByCss("#tableResults")



            ' Itera sulle righe della tabella

            For Each row In table.FindElementsByTag("tr")

                c = 1

                ' Itera sulle celle (td o th)

                For Each cell In row.FindElementsByTag("td")

                    Cells(r, c).Value = cell.Text

                    c = c + 1

                Next cell

                r = r + 1

            Next row

            On Error Resume Next    ' Gestione errore se non trova il pulsante

            Dd.FindElementByCss("li.m-pagination__item:nth-child(i)").Click

            On Error GoTo 0
            Dd.Wait 1000    ' Pausa per il caricamento
            r = Cells(Rows.Count, 1).End(xlUp).row - 1
        Next i

    End With

    Dd.Quit
 
Ultima modifica:

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
78.684
8.622
2.445
72
Napoli
Office 365
L @Luigi14

Ma perchè un pezzo di codice lo metti tra i TAG CODE e l'altro no?

Rettifica il post hai circa 30 minuti per farlo.
 
  • Like
Reactions: Luigi14

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
31.398
3.230
2.465
Como
2011Mac-365Win
Ciao,
un modo di cliccare sulla pagina successiva può essere questo
Visual Basic:
  Do
        Dt.Wait 1500

        '...... Qui estrai qui i dati della pagina corrente

        On Error Resume Next
        Set pagNext = Dt.FindElementByCss("a[title='Successiva']")
        On Error GoTo xt

        If pagNext Is Nothing Then Exit Do
        
        pagNext.Click
        
        Set pagNext = Nothing
    Loop
xt: '....Qui prevedi l'uscita
 

Luigi14

Utente abituale
Original poster
3 Aprile 2023
478
48
30
2019
Grazie ges @ges , funziona perfettamente . Altra chicca da mettere in cascina .- cappello_saluta
 

Rubik72

Excel/VBA Expert
Supermoderatore
12 Dicembre 2015
15.850
2.946
1.445
54
Cosenza
Excel365
Un saluto a tutti.
Si può evitare la gestione degli errori usando una Collection di elementi (che non genera errori nel caso di elementi non trovati) e contando gli elementi stessi, tipo:
Visual Basic:
[...]
    Dim pagNexts As Selenium.WebElements ' notare la "s" di WebElements

    Do
        Dt.Wait 1500

        '...... Qui estrai qui i dati della pagina corrente

        Set pagNexts = Dt.FindElementsByCss("a[title='Successiva']")
        If pagNexts.Count = 0 Then Exit Do
       
        pagNexts(1).Click       
    Loop
[...]
 

Luigi14

Utente abituale
Original poster
3 Aprile 2023
478
48
30
2019
Se posso aggiungere sotto : Ho difficoltà a salvare il testo estratto , forse perchè NON è una vera tabella ?
provato cosi :

Visual Basic:
 'scarica tutte le pagine
        For i = 1 To 14  'n. pagine

            Set Table = Dd.FindElementByCss("#tableResults")

            ' Itera sulle righe della tabella By forumexcel
            For Each row In Table.FindElementsByTag("tr")
                c = 1
                ' Itera sulle celle (td o th)
                For Each cell In row.FindElementsByTag("td")
                    Cells(r, c).Value = cell.Text
                    c = c + 1
                Next cell
                r = r + 1
            Next row

            Dim pagNexts As Selenium.WebElements    ' notare la "s" di WebElements
            
            Do
                Dd.Wait 1500
              
              ' For Each Table In Tables
                'Table.AsTable.ToExcel Cells(2, 1)
                           '     Next Table
                                                
                  r = 2: c = 1
                Ws1.Cells(r, c) = Table.Value
                
                uR = uR + 1
                                          
                          
                '...... Qui estrai qui i dati della pagina corrente

                Set pagNexts = Dd.FindElementsByCss("a[title='Successiva']")
                If pagNexts.Count = 0 Then Exit Do

                pagNexts(1).Click
            Loop
        Next
    End With