Soru Selenium basic ile webden combobox içindeki seçili değeri nasıl alabilirim?

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Yukarıda 9 No'lu mesajdaki mesajdaki konunun bu kez "For-Next döngüsü" kullanmadan XPath metoduyla çözümü için de aşağıdakini hazırladım;

Bu da hedefi 12'den vuruyor.... : 📌

C++:
Sub Test7()
'   Haluk - 17/05/2021
'   sa4truss@gmail.com
'   https://excelhaluk.blogspot.com/
    Dim Driver As New WebDriver
    Dim valOpt As String
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get ThisWorkbook.Path & "\Test.html"
    
    valOpt = Driver.FindElementByXPath("//input[@checked='checked']").FindElementByXPath("following-sibling::label[position()=1]").Text
    
    MsgBox "Seçili öğe : " & valOpt
    Driver.Close
    Driver.Quit
End Sub

Kodun yaptığı iş kısaca şöyle; HTML gövdesinde "checked" attribute değeri yine "checked" olan "input" elemanını XPath ile bulup, yine XPath ile bu elemanın sağına doğru 1.nci "Label" elemanının Text değerini valOpt isimli değişkene aktar ve sonucu MsgBox ile göster....

.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Burada bulunsun, belki birisine lâzım olur diye yazıyorum....

Selenium ile URL'deki bir tablodan verileri Excel'e almaya yönelik ufak bir çalışma hazırladım. Kodlar ve kodların çalıştırılmasına ilişkin animasyon aşağıda verilmiştir...

C++:
Sub Test8()
'   Haluk - 18/05/2021
'   sa4truss@gmail.com
'   https://excelhaluk.blogspot.com/

    Dim Driver As New WebDriver, i As Byte, j As Byte
   
    Range("A1:G20") = ""

    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "https://www.tcmb.gov.tr/kurlar/today.xml"
   
   
    For j = 1 To 7
        Cells(1, j) = Driver.FindElementByXPath("//table[1]/tbody/tr[1]/th[" & j & "]").Text
        For i = 2 To 20
            Cells(i, j) = Driver.FindElementByXPath("//table[1]/tbody/tr[" & i & "]/td[" & j & "]").Text
        Next
    Next
   
    Driver.Close
    Driver.Quit
End Sub

TempHD.gif


.
 

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Haluk üstadım müsadenizle Table yöntemi ile de ben ekleyeyim.
Kod:
Sub Test9()
'   Haluk - 18/05/2021
'   sa4truss@gmail.com
'   https://excelhaluk.blogspot.com/

    Dim Driver As New WebDriver, i As Byte, j As Byte
    Dim tablom As TableElement
   
    Range("A1:G20") = ""
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "https://www.tcmb.gov.tr/kurlar/today.xml"
   
   Set tablom = Driver.FindElementByClass("kurlarTablo").AsTable
   tablom.ToExcel Range("A1")
   
    Driver.Close
    Driver.Quit
End Sub
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
@askm ,

"AsTable" metodunu görmüştüm de kurcalamaya fırsat olmamıştı, güzel bir yöntem.... For-Next döngüsüne göre çok başarılı olduğu kesin.

Teşekkürler....

.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
23 No'lu mesajda @askm tarafından önerilen "AsTable" metodunu kullanarak URL üzerindeki sayfada tespit edilen tabloyu , bu metodun "Data" fonksiyonuyla 2 boyutlu bir diziye çevirerek, bütün tablo yerine; tablonun içinden sadece istediğimiz verilerin yer aldığı hücrenin row (satır), column (sütun) parametrelerini kullanarak nokta atışı ile istediğimiz verileri de çekebiliyoruz.

Örnek; TCMB'nin Günlük Kurlar tablosunda USD-Banknot için Alış ve Satış fiyatlarını elde etmek için;

C++:
Sub Test10()
'   Haluk & askm - 18/05/2021
'   sa4truss@gmail.com
'   https://excelhaluk.blogspot.com/

    Dim Driver As New WebDriver
    Dim myTable() As Variant
  
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "https://www.tcmb.gov.tr/kurlar/today.xml"
  
    myTable = Driver.FindElementByClass("kurlarTablo").AsTable.Data

    MsgBox "USD Alış: " & myTable(2, 6) & vbCrLf & "USD Satış: " & myTable(2, 7)
    
    Driver.Close
    Driver.Quit
End Sub

.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bu kez, bir web sayfasındaki açılır kutular aracılığıyla tarih seçimi yapılarak oluşan web sayfasındaki tabloların aktarılmasını içeren bir örnek hazırladım.

Verileri, İzmir Büyükşehir Belediyesi'nin aşağıdaki linkte yer web sitesinden alıyoruz....

Not: Seçilen tarihin Resmi Tatil günü olmaması gerekir, o tür kontroller ilave etmedim.


Capture.PNG


Yukarıdaki resimde görülen Yıl, Ay ve Gün açılır kutularından seçimlerin yapılarak verilerin alınmasına ilişkin kod;

C++:
Sub Test11()
'   Haluk - 19/05/2021
'   sa4truss@gmail.com
'   https://excelhaluk.blogspot.com/

    Dim strDate As String, myDate As Date
    Dim Driver As New WebDriver
    Dim dataTables As WebElements, myTable As WebElement
    
    Range("B2:G" & Rows.Count) = ""
    
    strDate = Application.InputBox("Tarih girin")
    If IsDate(strDate) Then
        myDate = DateValue(strDate)
        
        myYear = Year(myDate)
        myMonth = Choose(Month(myDate), "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", _
                                        "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık")
        myDay = Format(Day(myDate), "00")
    Else
        MsgBox "Girilen tarih GEÇERSİZ" & vbCrLf & "aa.gg.yyyy formatında geçerli bir tarih girin"
        Exit Sub
    End If
    
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "http://eislem.izmir.bel.tr/halfiyatlari.aspx"
   
    Set optYear = Driver.FindElementByXPath("/html/body/form/div[3]/div/div[4]/div[2]/div[2]/div[1]/table/" & _
                                            "tbody/tr[3]/td/div/div[1]/table/tbody/tr/td/div/table/tbody/" & _
                                            "tr/td/div/table/tbody/tr[1]/td/select[1]").AsSelect
    optYear.SelectByText myYear
    Driver.Wait 2000
    
    Set optMonth = Driver.FindElementByXPath("/html/body/form/div[3]/div/div[4]/div[2]/div[2]/div[1]/table/" & _
                                            "tbody/tr[3]/td/div/div[1]/table/tbody/tr/td/div/table/tbody/" & _
                                            "tr/td/div/table/tbody/tr[1]/td/select[2]").AsSelect
    optMonth.SelectByText myMonth
    Driver.Wait 2000
    
    Set optDay = Driver.FindElementByXPath("/html/body/form/div[3]/div/div[4]/div[2]/div[2]/div[1]/table/" & _
                                           "tbody/tr[3]/td/div/div[1]/table/tbody/tr/td/div/table/tbody/" & _
                                           "tr/td/div/table/tbody/tr[1]/td/select[3]").AsSelect
    optDay.SelectByText myDay
    Driver.Wait 3000
    
    Set dataTables = Driver.FindElementByXPath("/html/body/form/div[3]/div/div[4]/div[2]/div[2]/div[1]/table/" & _
                                        "tbody/tr[3]/td/div/div[1]/table/tbody/tr/td/div/table/tbody/tr/" & _
                                        "td/div/table/tbody/tr[2]/td/div").FindElementsByTag("table")
    
    countTables = dataTables.Count
       
    For i = 2 To (countTables - 1)
        Set myTable = Driver.FindElementByXPath("/html/body/form/div[3]/div/div[4]/div[2]/div[2]/div[1]/table/" & _
                                                "tbody/tr[3]/td/div/div[1]/table/tbody/tr/td/div/table/tbody/tr/" & _
                                                "td/div/table/tbody/tr[2]/td/div/table/tbody/" & _
                                                "tr[" & i & "]/td/table/tbody", timeout:=0, Raise:=False)
        If myTable Is Nothing Then
            Exit For
        Else
            myTable.AsTable.ToExcel Range("A" & i)
        End If
    Next
    
    MsgBox "Veriler alındı...!", vbInformation
    
    Driver.Close
    Driver.Quit
End Sub

.
 
Son düzenleme:

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Haluk Üstad Aşağıdaki şekilde resimleri de ekleyerek alınabilir. XPath yöntemi ile değil de id yöntemi ile.

Kod:
Sub Test11()
    Dim strDate As String, myDate As Date
    Dim Driver As New WebDriver
    Dim Tablolar As WebElements, tabloH As TableElement
    Range("A1:G" & Rows.Count) = ""
    Call Belirli_Bir_Alandaki_Resimleri_Sil
    On Error GoTo Hata
    strDate = Application.InputBox("Tarih girin")
    If IsDate(strDate) Then
        myDate = DateValue(strDate)
        
        myYear = Year(myDate)
        myMonth = Choose(Month(myDate), "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", _
                                        "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık")
        myDay = Format(Day(myDate), "00")
    Else
        MsgBox "Girilen tarih GEÇERSİZ" & vbCrLf & "aa.gg.yyyy formatında geçerli bir tarih girin"
        Exit Sub
    End If
    
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "http://eislem.izmir.bel.tr/halfiyatlari.aspx"
   
    Set optYear = Driver.FindElementById("ctl00_cp_dropYil").AsSelect
    optYear.SelectByText myYear
    Driver.Wait 2000
    
    Set optMonth = Driver.FindElementById("ctl00_cp_dropAy").AsSelect
    optMonth.SelectByText myMonth
    Driver.Wait 2000
    
    Set optDay = Driver.FindElementById("ctl00_cp_dropGun").AsSelect
    optDay.SelectByText myDay
    Driver.Wait 3000
    
    Set Tablolar = Driver.FindElementByClass("GridMain").FindElementsByTag("table")
    countTables = Tablolar.Count
    Tablolar(1).AsTable.ToExcel Range("A1")

    Rows("2:1000").RowHeight = 90
    Columns("A:A").ColumnWidth = 25
    Range("A1:G1").Font.Bold = True
    For i = 2 To countTables
        Set tabloH = Tablolar(i).AsTable
        tabloH.ToExcel Range("A" & i)
        
        Range("A" & i).Select
        resimyolu = Tablolar(i).FindElementByTag("img").Attribute("src")
        ActiveSheet.Pictures.Insert(resimyolu).Select
        With Selection
                .ShapeRange.LockAspectRatio = msoFalse
                .Top = Range("A" & i).Top + 1
                .Left = Range("A" & i).Left + 1
                .Width = Range("A" & i).Width - 3
                .Height = Range("A" & i).Height - 3
        End With
        
    Next
    MsgBox "Veriler alındı...!", vbInformation
    
    Driver.Close
    Driver.Quit
Hata:
    MsgBox "Veriler getirilirken hata oluştu." & vbLf & _
        "Lütfen tarihin olduğunu kontrol ediniz...", vbInformation
    
    Driver.Close
    Driver.Quit
End Sub

Sub Belirli_Bir_Alandaki_Resimleri_Sil()
    Dim Resim As Picture, Alan As Range
    Set Alan = Range("A2:A1000")
    For Each Resim In ActiveSheet.Pictures
        If Not Intersect(Resim.TopLeftCell, Alan) Is Nothing Then
            Resim.Delete
        End If
    Next
    Set Alan = Nothing
End Sub
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
@askm ;

Öncelikle XPath yerine ID ile elemanları seçmek daha iyi olmuş. Ben ID'leri bulamamıştım.... bu açıdan güzel olmuş, tebrikler....

Diğer yandan; resimleri de aldığınıza göre, geriye Excel'in seçilen yemekleri pişirmesi kalmış..... Bu da olmazsa, en azından birer yemek tarifi verebilir :)

Not: Kodlarda, "Hata:" satırından önce "Exit Sub" ilave etmekte fayda var.

.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Mahir Bey, o da olur valla ... :)

.
 

Mahir64

Destek Ekibi
Destek Ekibi
Katılım
19 Nisan 2006
Mesajlar
6,674
Excel Vers. ve Dili
Excel 2013-Türkçe
Excel 2016-Türkçe
Hep hayalim, anlatıp anlatım yapamayan birine ekrandan yumruk çıkması. Ben bunu bekliyorum. :)
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Not: Kodlarda, "Hata:" satırından önce "Exit Sub" ilave etmekte fayda var.
Bazı günler hal çalışmadığı için listede çıkmıyor. Bu da hataya neden veriyor. Örneğin:16.05.2021 gibi. Bu durumu sonradan fark ettiğim için hata kodu ekledim. Exit sub kısmını atlamışım.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bazı günler hal çalışmadığı için listede çıkmıyor. Bu da hataya neden veriyor. Örneğin:16.05.2021 gibi. Bu durumu sonradan fark ettiğim için hata kodu ekledim. Exit sub kısmını atlamışım.
O hata, muhtemelen seçilen tarihin 27 No'lu mesajımdaki "Not" bölümünde belirttiğim gibi, hafta sonu veya resmi tatil olmasından kaynaklanıyordur.

Ona yönelik de bir tarih kontrolu yapılabilir tabii, ama artık o tür şeyler işin aksesuarı....

.
 

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Aşağıdaki şekilde gün ve ay kontrolü yapılabiliyor.
Kod:
Sub Test11()
    Dim strDate As String, myDate As Date
    Dim Driver As New WebDriver
    Dim Tablolar As WebElements, tabloH As TableElement
    Dim takvimSec As WebElements
    Dim ay As Byte, gun As Byte
    
    Range("A1:G" & Rows.Count) = ""
    Call Belirli_Bir_Alandaki_Resimleri_Sil
    On Error GoTo Hata
    strDate = Application.InputBox("Tarih girin")
    If IsDate(strDate) Then
        myDate = DateValue(strDate)
        
        myYear = Year(myDate)
        myMonth = Choose(Month(myDate), "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", _
                                        "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık")
        myDay = Format(Day(myDate), "00")
    Else
        MsgBox "Girilen tarih GEÇERSİZ" & vbCrLf & "aa.gg.yyyy formatında geçerli bir tarih girin"
        Exit Sub
    End If
    
    Driver.AddArgument "--headless"
    Driver.Start "chrome"
    Driver.Get "http://eislem.izmir.bel.tr/halfiyatlari.aspx"
   
    Set optYear = Driver.FindElementById("ctl00_cp_dropYil").AsSelect
    optYear.SelectByText myYear
    Driver.Wait 2000
    
    ay = 0
    Set takvimSec = Driver.FindElementById("ctl00_cp_dropAy").FindElementsByTag("option")
    For t1 = 1 To takvimSec.Count
        If myMonth = takvimSec(t1).Text Then
            ay = 1
            Exit For
        End If
    Next t1
    If ay = 0 Then
        MsgBox "Seçilen ay mevcut değil!", vbInformation
        Driver.Close
        Driver.Quit
        Exit Sub
    End If
    Set optMonth = Driver.FindElementById("ctl00_cp_dropAy").AsSelect
    optMonth.SelectByText myMonth
    Driver.Wait 2000
    
    gun = 0
    Set takvimSec = Driver.FindElementById("ctl00_cp_dropGun").FindElementsByTag("option")
    For t1 = 1 To takvimSec.Count
        If myDay = takvimSec(t1).Text Then
            gun = 1
            Exit For
        End If
    Next t1
    If gun = 0 Then
        MsgBox "Seçilen gün mevcut değil!", vbInformation
        Driver.Close
        Driver.Quit
        Exit Sub
    End If
    
    Set optDay = Driver.FindElementById("ctl00_cp_dropGun").AsSelect
    optDay.SelectByText myDay
    Driver.Wait 3000
    
    Set Tablolar = Driver.FindElementByClass("GridMain").FindElementsByTag("table")
    countTables = Tablolar.Count
    Tablolar(1).AsTable.ToExcel Range("A1")
    Rows("2:1000").RowHeight = 90
    Columns("A:A").ColumnWidth = 25
    Range("A1:G1").Font.Bold = True
    For i = 2 To countTables
        Set tabloH = Tablolar(i).AsTable
        tabloH.ToExcel Range("A" & i)
        
        Range("A" & i).Select
        resimyolu = Tablolar(i).FindElementByTag("img").Attribute("src")
        ActiveSheet.Pictures.Insert(resimyolu).Select
        With Selection
                .ShapeRange.LockAspectRatio = msoFalse
                .Top = Range("A" & i).Top + 1
                .Left = Range("A" & i).Left + 1
                .Width = Range("A" & i).Width - 3
                .Height = Range("A" & i).Height - 3
        End With
        
    Next
    MsgBox "Veriler alındı...!", vbInformation
    
    Driver.Close
    Driver.Quit
    Exit Sub
Hata:
    MsgBox "Veriler getirilirken hata oluştu." & vbLf & _
        "Lütfen tarihin olduğunu kontrol ediniz...", vbInformation
    
    Driver.Close
    Driver.Quit
End Sub

Sub Belirli_Bir_Alandaki_Resimleri_Sil()
    Dim Resim As Picture, Alan As Range
    Set Alan = Range("A2:A1000")
    For Each Resim In ActiveSheet.Pictures
        If Not Intersect(Resim.TopLeftCell, Alan) Is Nothing Then
            Resim.Delete
        End If
    Next
    Set Alan = Nothing
End Sub
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Web sayfasındaki ComboBox'larla ilgili bir başka örnek de aşağıdaki linktedir....

"İstanbul Eczacı Odası'ndan Nöbetçi Eczaneler" verilerinin alınması...


.
 
Katılım
27 Mayıs 2021
Mesajlar
4
Excel Vers. ve Dili
Sürüm 2104
VBA
selenium
@Haluk hocam merhaba,
Sizi burada yakalamışken bir soru da ben sormak istiyorum müsadenizle :)

Selenium ile yapmak istediğim excel hücresine tanımladığım web sitesini chrome ile açtırmak istiyorum.

örn;

Kod:
Dim Chrome As Selenium.ChromeDriver

Sub Main

  Set Chrome= New Selenium.ChromeDriver
  Chrome.Get "https://www.excel.web.tr/"  'Burada yapmak istediğim örn a1 hücresindeki veriye gitmesini istiyorum

End Sub
Yardımlarınız için şimdiden teşekkür ederim.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,305
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
C++:
Dim Chrome As Selenium.ChromeDriver
'
Sub Main()
  Set Chrome = New Selenium.ChromeDriver
  Chrome.Get Sheets("Sheet1").Range("A1")
  
End Sub
'
Sub Auto_Close()
    Chrome.Close
    Chrome.Quit
End Sub
.
 
Üst