getElementsByTagName("td").Item(n)

Liên hệ QC

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Khi muốn lấy data từ 1 trang web em sử dụng đoạn code tương tự như dươi, để lấy giá trị 1 cell :
Set Datas = ieDoc.getElementById("formMain:sheet_tbl").getElementsByTagName("td")(n)
Range("A5").Value = Datas.innerText

Nhưng em muốn upload dữ liệu lên cell đó và em thử làm:
Set Datas = ieDoc.getElementById("formMain:sheet_tbl").getElementsByTagName("td")(n)
Datas.innerText = Range("A5").Value ( Range("A5").Value = 10)
Sau khi chạy code thì ô đó có giá trị là 10 , nhưng khi em nhấn Save thì nó trở về rỗng "" ( giá trị mặc định là rỗng), không lưu giá trị bằng 10 được.
Em nghĩ .innerText chỉ có tác dụng về hiển thị nên ko add giá trị thực đc, em có thử:
Datas.value = Range("A5").Value
Nhưng bị lỗi.
Rất mong anh/chị nào biết vấn đề này chỉ giúp em! Để em có thể add giá trị vào cell trên web.
Vì Web up dữ liệu là web nội bộ nên em ko tiện up full code!
Kính chúc anh/chị năm mới nhiều sức khỏe và bình an!
 
Em có cảm giác mình đã ở rất gần kết quả nhưng em không thể tìm ra ( vì em không có căn bản lập trình - chủ yếu bắt trước các anh trên GPE)!
1- Khi thực hiện đoạn code:
Set Datas = ieDoc.getElementById("formMain:sheet_tbl").getElementsByTagName("td")(n)
Datas.innerText = Range("A5").Value
( = 10)
thì giá trị 10 đã được thêm vào Cell trên web. Nhưng khi em nhấp chuột vào ô đó hoặc chọn Save, thì giá trị 10 biến mất!
2- Nếu em nhấp chuột vào ô web và gõ: 10 thì Save giá trị đó được giữ nguyên không mất!
Em không biết ngoài ".innertext" mình còn có thể sử dụng đuôi gì khác ko ạ! Giống như kiểu ".value" để giá trị đó không bị mất khi Save!

Rất mong các anh/chị giúp em!
 
Upvote 0
Upvote 0
Bạn xem ví dụ nhé.
Nếu website đó có API cho phép 'get/post' thì dùng requests.

Em không biết cách để xem trang Web đó có API không ! Hix!
Bài đã được tự động gộp:

Em mới phát hiện ra 1 điều nếu em sử dụng ".innertext" để login tài khoản tại trang web đó:
ieDoc.getElementById("formMain:userName").innerText = "userID"
thì vẫn Login bình thường, như vậy không phải do ".innertext" mà nó không ghi nhận kết quả mới!
Em không biết có phải do cách thức Web HTML ghi nhận kết quả không nữa!

Set Datas = ieDoc.getElementById("formMain:sheet_tbl").getElementsByTagName("td")(n)
Datas.innerText = Range("A5").Value
( = 888)
Khi em kiểm tra: Inspect Element thì thấy giá trị "888" đã được add vào
Debug.Print Datas.innerText cũng cho ra kết quả "888"
Nhưng khi nhấp chuột vào ô đó ( hoặc nhấn save) nó lại trở về giá trị ban đầu, không nhận giá trị mới.

Mong các anh giúp đỡ!

1549680392625.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử tìm hiểu về SeleniumBasic xem.
Link download: https://florentbr.github.io/SeleniumBasic/
Link tham khảo: https://www.youtube.com/playlist?list=PLqVNaS_BLQeaKnmDCxmvuQvibai5dTeMJ ( Không phải tiếng anh, nhưng bạn xem rồi học hỏi cũng được.)

Bạn có thể tải tiện ích Selenium IDE cho chrome hay firefox( ie mình không biết có không). rồi record nó giống macro trong excel, mày mò làm theo là được.

Đây là code đơn giản tự động đăng nhập vào trang gpe và link tới trang này.
Mã:
Dim Driver As WebDriver
Sub testSelenium()
Set Driver = New ChromeDriver
Driver.Get "https://giaiphapexcel.com/diendan/ewr-porta/"
Dim table As WebElement
Set table = Driver.FindElementByXPath("/html/body/div[2]/div[1]/nav/div/div[3]/div[1]/a[1]/span")
table.Click
Set table = Driver.FindElementByName("login")
table.SendKeys "TaiKhoanCuaBan"
Application.Wait 1000
Set table = Driver.FindElementByName("password")
table.SendKeys "MatKhauCuaBan"
Application.Wait 1000
Set table = Driver.FindElementByXPath("/html/body/div[5]/div/div[2]/div/form/div[1]/dl/dd/div/div[2]/button")
table.Click
Set table = Driver.FindElementByXPath("/html/body/div[2]/div[1]/nav/div/div[2]/div/ul/li[2]/div/a[1]")
table.Click
Set table = Driver.FindElementByXPath("/html/body/div[2]/div[4]/div/div[2]/div[1]/div/div[4]/div/div/div[1]/div/div[1]/h3")
table.Click
Set table = Driver.FindElementByXPath("//a[contains(@href, '/diendan/threads/getelementsbytagname-td-item-n.140597/')]")
table.Click
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Dim Driver As WebDriver
Sub testSelenium()

Set Driver = New ChromeDriver

Dim pas As Range
Set pas = Range("K3")

Driver.Get "URL"     ' Web can up du lieu
Dim table As WebElement
''================các buoc dang nhap - chon tab den vung can up du lieu============
Set table = Driver.FindElementByName("formMain:userName")
table.SendKeys "User"
Application.Wait 1000
Set table = Driver.FindElementByName("formMain:j_idt2")
table.SendKeys "Pass"
Application.Wait 1000
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[7]/td[2]/input")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[1]/table[1]/tbody/tr/td[2]/table/tbody/tr/td[2]/input")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/a/span[2]")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/ul/li[1]/a/span")
table.Click
Set table = Driver.FindElementById("formMain:cbSelectOrg")
table.SendKeys "Text"
Application.Wait 2000
Set table = Driver.FindElementById("formMain:j_idt7")
table.Click
Application.Wait 2000

'==============================add data===========================
For i = 4 To 28
Set table = Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i)
table.ClickDouble
SendKeys Range("I5").Offset(0, i - 4).Value
Application.Wait 1000
    If table.Text = "" Then   ' kiem tra lai
        table.ClickDouble
        SendKeys Range("I5").Offset(0, i - 4).Value
    End If
   
Next i
Set tablesav = Driver.FindElementById("formMain:btnSaveAll") ' Save
tablesav.Click
End Sub

Trên đây là đoạn code em dựa vào Selenium Webdriver để code ( Với sự giúp đỡ của các anh @befaint ,@gttrongvn ).
Em thấy Selenium khá thú vị! Đôi khi khó khăn lại giúp ta tiếp cận nhiều thứ mới! Cảm ơn các anh rất nhiều ạ!
Nhưng có một số thứ em vẫn chưa thể khắc phục được, em mong các anh giúp đỡ:
1.> Em không thể tìm ra cách để add value vào:
Set table = Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i)
Em không thể add kiểu : table.text = Range("I5").Offset(0, i - 4).Value hay table.sendkeys cũng ko được
Mong các anh chỉ giúp em cách để add trực tiệp giá trị vào!
Hiện tại em phải xài kiểu thủ công:
+ Table.ClickDouble: để chọn cell cần nhập, rồi Sendkeys ( giống kiểu click chuột rồi nhập tay)

2.> MÌnh có thể cho Chrome chạy ẩn không ạ! Giống như mình hay làm với IE: IE.visible True/False


Rất mong được các anh giúp đỡ! Em cảm ơn rất nhiều ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có trang web nào có nội dung tương tự bạn đang thao tác không, mình xem rồi mình làm thử.
 
Upvote 0
Mã:
Dim Driver As WebDriver
Sub testSelenium()

Set Driver = New ChromeDriver

Dim pas As Range
Set pas = Range("K3")

Driver.Get "URL"     ' Web can up du lieu
Dim table As WebElement
''================các buoc dang nhap - chon tab den vung can up du lieu============
Set table = Driver.FindElementByName("formMain:userName")
table.SendKeys "User"
Application.Wait 1000
Set table = Driver.FindElementByName("formMain:j_idt2")
table.SendKeys "Pass"
Application.Wait 1000
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[7]/td[2]/input")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[1]/table[1]/tbody/tr/td[2]/table/tbody/tr/td[2]/input")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/a/span[2]")
table.Click
Set table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/ul/li[1]/a/span")
table.Click
Set table = Driver.FindElementById("formMain:cbSelectOrg")
table.SendKeys "Text"
Application.Wait 2000
Set table = Driver.FindElementById("formMain:j_idt7")
table.Click
Application.Wait 2000

'==============================add data===========================
For i = 4 To 28
Set table = Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i)
table.ClickDouble
SendKeys Range("I5").Offset(0, i - 4).Value
Application.Wait 1000
    If table.Text = "" Then   ' kiem tra lai
        table.ClickDouble
        SendKeys Range("I5").Offset(0, i - 4).Value
    End If
 
Next i
Set tablesav = Driver.FindElementById("formMain:btnSaveAll") ' Save
tablesav.Click
End Sub

Trên đây là đoạn code em dựa vào Selenium Webdriver để code ( Với sự giúp đỡ của các anh @befaint ,@gttrongvn ).
Em thấy Selenium khá thú vị! Đôi khi khó khăn lại giúp ta tiếp cận nhiều thứ mới! Cảm ơn các anh rất nhiều ạ!
Nhưng có một số thứ em vẫn chưa thể khắc phục được, em mong các anh giúp đỡ:
1.> Em không thể tìm ra cách để add value vào:
Set table = Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i)
Em không thể add kiểu : table.text = Range("I5").Offset(0, i - 4).Value hay table.sendkeys cũng ko được
Mong các anh chỉ giúp em cách để add trực tiệp giá trị vào!
Hiện tại em phải xài kiểu thủ công:
+ Table.ClickDouble: để chọn cell cần nhập, rồi Sendkeys ( giống kiểu click chuột rồi nhập tay)

2.> MÌnh có thể cho Chrome chạy ẩn không ạ! Giống như mình hay làm với IE: IE.visible True/False


Rất mong được các anh giúp đỡ! Em cảm ơn rất nhiều ạ!
Trong Code của bạn đã nhầm giữa SendKeys của VBA và của Selenium.
Chổ này "Range("I5").Offset(0, i - 4).Value" dữ liệu nằm trên cùng một hàng? Sao không phải là theo cột?

Bạn thử Code dưới đây, viết theo cảm tính
Mở Chrome ở chế độ Debuging để kết nối lại mà không cần phải mở lại Chrome lần nữa
Lưu ý chạy ở chế độ này nó sẽ sao chép một thư mục Profile của chrome sang một Thư mục mới ở trong Document hoặc Ngay tại thư mục của Workbook. Một Chrome Webdriver sẽ chạy ngầm để điều khiển Chrome
Chổ này cần viết code thêm để Kết thúc Chrome Webdriver

PHP:
Public Driver As selenium.WebDriver
Sub test_Check_Chromium()
  Debug.Print Check_Chromium("Chrome")
End Sub
  Function Check_Chromium(Optional Browser As String = "chrome") As Boolean
    Dim Process As Object
    For Each Process In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
              ("SELECT * FROM Win32_Process WHERE Name = """ & Browser & ".exe""", , 48)
      If LCase$(Process.CommandLine) Like "*-user-data-dir=remote-profile*" Then _
        Check_Chromium = True: Exit Function
    Next Process
  End Function
Sub test_ConnectBrowser()
  Debug.Print ConnectBrowser("chrome")
  Driver.Get "https://www.google.com.vn/"
End Sub
  Function ConnectBrowser(Optional Browser As String = "chrome") As String
    Dim Wsh As Object, CocCoc$, Chrome$
    Chrome = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
    CocCoc = "%USERPROFILE%\AppData\Local\CocCoc\Browser\Application\browser.exe"
    If Check_Chromium("chrome") Then
      ConnectBrowser = "chrome"
    ElseIf Check_Chromium("browser") Then
      ConnectBrowser = "coccoc"
    Else
      ConnectBrowser = ""
      Set Wsh = VBA.CreateObject("WScript.Shell")
      If LCase$(Browser) = "chrome" Then
        Wsh.Run Chrome & " --remote-debugging-port=9222 --user-data-dir=remote-profile --lang=vi"
      Else
        Wsh.Run CocCoc _
            & " --remote-debugging-port=9222 --user-data-dir=remote-profile-cc  --lang=vi"
      End If
    End If
    Set Driver = New ChromeDriver
    Driver.SetCapability "debuggerAddress", "127.0.0.1:9222"
    Driver.Start "chrome"
  End Function
Sub testSelenium()

  ConnectBrowser "chrome"

  Dim pas As Range
  Set pas = Range("K3")

  Driver.Get "URL"     ' Web can up du lieu
  Dim Table As Object
  ''================các buoc dang nhap - chon tab den vung can up du lieu============
  Set Table = Driver.FindElementByName("formMain:userName")
  Table.Clear.SendKeys "User"
  Set Table = Driver.FindElementByName("formMain:j_idt2")
  Table.Clear.SendKeys "Pass"
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[7]/td[2]/input")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[1]/table[1]/tbody/tr/td[2]/table/tbody/tr/td[2]/input")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/a/span[2]")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/ul/li[1]/a/span")
  Table.Click
  Set Table = Driver.FindElementById("formMain:cbSelectOrg")
  Table.Clear.SendKeys "Text"
  Driver.Wait 1000
  Set Table = Driver.FindElementById("formMain:j_idt7")
  Table.Click
  Driver.Wait 1000

  '==============================add data===========================
  Dim Arr: Arr = Range("I5").Resize(, 28).Value
  For i = 4 To 28
    Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i) _
    .Clear.SendKeys Arr(1, i - 3)
    Driver.Wait 1000
  Next i
  Driver.FindElementById("formMain:btnSaveAll").Click
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trong Code của bạn đã nhầm giữa SendKeys của VBA và của Selenium.
Chổ này "Range("I5").Offset(0, i - 4).Value" dữ liệu nằm trên cùng một hàng? Sao không phải là theo cột?

Bạn thử Code dưới đây, viết theo cảm tính
Mở Chrome ở chế độ Debuging để kết nối lại mà không cần phải mở lại Chrome lần nữa
Lưu ý chạy ở chế độ này nó sẽ sao chép một thư mục Profile của chrome sang một Thư mục mới ở trong Document hoặc Ngay tại thư mục của Workbook. Một Chrome Webdriver sẽ chạy ngầm để điều khiển Chrome
Chổ này cần viết code thêm để Kết thúc Chrome Webdriver

PHP:
Public Driver As selenium.WebDriver
Sub test_Check_Chromium()
  Debug.Print Check_Chromium("Chrome")
End Sub
  Function Check_Chromium(Optional Browser As String = "chrome") As Boolean
    Dim Process As Object
    For Each Process In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
              ("SELECT * FROM Win32_Process WHERE Name = """ & Browser & ".exe""", , 48)
      If LCase$(Process.CommandLine) Like "*-user-data-dir=remote-profile*" Then _
        Check_Chromium = True: Exit Function
    Next Process
  End Function
Sub test_ConnectBrowser()
  Debug.Print ConnectBrowser("chrome")
  Driver.Get "https://www.google.com.vn/"
End Sub
  Function ConnectBrowser(Optional Browser As String = "chrome") As String
    Dim Wsh As Object, CocCoc$, Chrome$
    Chrome = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
    CocCoc = "%USERPROFILE%\AppData\Local\CocCoc\Browser\Application\browser.exe"
    If Check_Chromium("chrome") Then
      ConnectBrowser = "chrome"
    ElseIf Check_Chromium("browser") Then
      ConnectBrowser = "coccoc"
    Else
      ConnectBrowser = ""
      Set Wsh = VBA.CreateObject("WScript.Shell")
      If LCase$(Browser) = "chrome" Then
        Wsh.Run Chrome & " --remote-debugging-port=9222 --user-data-dir=remote-profile --lang=vi"
      Else
        Wsh.Run CocCoc _
            & " --remote-debugging-port=9222 --user-data-dir=remote-profile-cc  --lang=vi"
      End If
    End If
    Set Driver = New ChromeDriver
    Driver.SetCapability "debuggerAddress", "127.0.0.1:9222"
    Driver.Start "chrome"
  End Function
Sub testSelenium()

  ConnectBrowser "chrome"

  Dim pas As Range
  Set pas = Range("K3")

  Driver.Get "URL"     ' Web can up du lieu
  Dim Table As Object
  ''================các buoc dang nhap - chon tab den vung can up du lieu============
  Set Table = Driver.FindElementByName("formMain:userName")
  Table.Clear.SendKeys "User"
  Set Table = Driver.FindElementByName("formMain:j_idt2")
  Table.Clear.SendKeys "Pass"
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[7]/td[2]/input")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[1]/table[1]/tbody/tr/td[2]/table/tbody/tr/td[2]/input")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/a/span[2]")
  Table.Click
  Set Table = Driver.FindElementByXPath("/html/body/form/div[2]/div[1]/ul/li[4]/ul/li[1]/a/span")
  Table.Click
  Set Table = Driver.FindElementById("formMain:cbSelectOrg")
  Table.Clear.SendKeys "Text"
  Driver.Wait 1000
  Set Table = Driver.FindElementById("formMain:j_idt7")
  Table.Click
  Driver.Wait 1000

  '==============================add data===========================
  Dim Arr: Arr = Range("I5").Resize(, 28).Value
  For i = 4 To 28
    Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i) _
    .Clear.SendKeys Arr(1, i - 3)
    Driver.Wait 1000
  Next i
  Driver.FindElementById("formMain:btnSaveAll").Click
End Sub

Em cảm ơn sự giúp đỡ của anh @HeSanbi !
Em đã chạy thử code của anh!
1.> Chỗ add dữ liệu vẫn bị lỗi không add được anh ơi! ( Hình đính kèm: Err1)
Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i) _
.Clear.SendKeys Arr(1, i - 3)

Err1.png

2.> Làm sao để : Mở Chrome ở chế độ Debuging anh chỉ giúp em được không anh! em ko biết!

3.> Em thử chạy code Selenium để add dữ liệu vào Web: https://www.vietcombank.com.vn nhưng không được:


Mã:
Public Driver As selenium.WebDriver
Sub test_Check_Chromium()
  Debug.Print Check_Chromium("Chrome")
End Sub
  Function Check_Chromium(Optional Browser As String = "chrome") As Boolean
    Dim Process As Object
    For Each Process In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
              ("SELECT * FROM Win32_Process WHERE Name = """ & Browser & ".exe""", , 48)
      If LCase$(Process.commandLine) Like "*-user-data-dir=remote-profile*" Then _
        Check_Chromium = True: Exit Function
    Next Process
  End Function
Sub test_ConnectBrowser()
  Debug.Print ConnectBrowser("chrome")
  Driver.Get "https://www.google.com.vn/"
End Sub
  Function ConnectBrowser(Optional Browser As String = "chrome") As String
    Dim Wsh As Object, CocCoc$, Chrome$
    Chrome = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
    CocCoc = "%USERPROFILE%\AppData\Local\CocCoc\Browser\Application\browser.exe"
    If Check_Chromium("chrome") Then
      ConnectBrowser = "chrome"
    ElseIf Check_Chromium("browser") Then
      ConnectBrowser = "coccoc"
    Else
      ConnectBrowser = ""
      Set Wsh = VBA.CreateObject("WScript.Shell")
      If LCase$(Browser) = "chrome" Then
        Wsh.Run Chrome & " --remote-debugging-port=9222 --user-data-dir=remote-profile --lang=vi"
      Else
        Wsh.Run CocCoc _
            & " --remote-debugging-port=9222 --user-data-dir=remote-profile-cc  --lang=vi"
      End If
    End If
    Set Driver = New ChromeDriver
    Driver.SetCapability "debuggerAddress", "127.0.0.1:9222"
    Driver.Start "chrome"
  End Function

'====================================================
Sub testSelenium()
    ConnectBrowser "chrome"
    Driver.Get "https://www.vietcombank.com.vn/"     ' Web can up du lieu

  '==============================add data===========================
  Dim Table As Object
        Set Table = Driver.FindElementByXPath("/html/body/div/form/div[4]/div[2]/div[4]/div[2]/div[1]/table/tbody/tr[3]/td[2]")
        Table.ClickDouble
        Table.Clear.SendKeys Range("I5").Value 
End Sub

Nhưng em có thể add được nếu chạy theo code này: ( gia tri add: 88)

Mã:
Sub TEST1()

Dim ieApp As InternetExplorer
Dim ieDoc As Object
Dim NewURL As String

Set ieApp = New InternetExplorer
ieApp.Visible = True
        ieApp.navigate "https://www.vietcombank.com.vn/" 'go to login page

        Do While ieApp.Busy: DoEvents: Loop 'dynamic wait
        Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop 'dynamic wait =ieApp.readyState = 4 And Not ieApp.Busy: DoEvents: Loop '
Sleep 500
    Set ieDoc = ieApp.document
Set Datas = ieDoc.getElementById("Content_HomeSideBar_RatesBox_ExchangeRates_ExrateView").getElementsByTagName("td")(2)
Range("I4").Value = Datas.innerText
Datas.innerText = Range("I5").Value ( =88)
Debug.Print Datas.innerText
MsgBox ("Done")
End Sub
VCB2.png

Mong anh @HeSanbi giúp đỡ!
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn sự giúp đỡ của anh @HeSanbi !
Em đã chạy thử code của anh!
1.> Chỗ add dữ liệu vẫn bị lỗi không add được anh ơi! ( Hình đính kèm: Err1)
Driver.FindElementById("formMain:sheet_tbl").FindElementsByTag("td")(i) _
.Clear.SendKeys Arr(1, i - 3)

View attachment 212087

2.> Làm sao để : Mở Chrome ở chế độ Debuging anh chỉ giúp em được không anh! em ko biết!

3.> Em thử chạy code Selenium để add dữ liệu vào Web: https://www.vietcombank.com.vn nhưng không được:


Mã:
Public Driver As selenium.WebDriver
Sub test_Check_Chromium()
  Debug.Print Check_Chromium("Chrome")
End Sub
  Function Check_Chromium(Optional Browser As String = "chrome") As Boolean
    Dim Process As Object
    For Each Process In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
              ("SELECT * FROM Win32_Process WHERE Name = """ & Browser & ".exe""", , 48)
      If LCase$(Process.commandLine) Like "*-user-data-dir=remote-profile*" Then _
        Check_Chromium = True: Exit Function
    Next Process
  End Function
Sub test_ConnectBrowser()
  Debug.Print ConnectBrowser("chrome")
  Driver.Get "https://www.google.com.vn/"
End Sub
  Function ConnectBrowser(Optional Browser As String = "chrome") As String
    Dim Wsh As Object, CocCoc$, Chrome$
    Chrome = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
    CocCoc = "%USERPROFILE%\AppData\Local\CocCoc\Browser\Application\browser.exe"
    If Check_Chromium("chrome") Then
      ConnectBrowser = "chrome"
    ElseIf Check_Chromium("browser") Then
      ConnectBrowser = "coccoc"
    Else
      ConnectBrowser = ""
      Set Wsh = VBA.CreateObject("WScript.Shell")
      If LCase$(Browser) = "chrome" Then
        Wsh.Run Chrome & " --remote-debugging-port=9222 --user-data-dir=remote-profile --lang=vi"
      Else
        Wsh.Run CocCoc _
            & " --remote-debugging-port=9222 --user-data-dir=remote-profile-cc  --lang=vi"
      End If
    End If
    Set Driver = New ChromeDriver
    Driver.SetCapability "debuggerAddress", "127.0.0.1:9222"
    Driver.Start "chrome"
  End Function
Sub testSelenium()
  ConnectBrowser "chrome"

  Dim pas As Range
  Set pas = Range("K3")

  Driver.Get "https://www.vietcombank.com.vn/"     ' Web can up du lieu



  '==============================add data===========================
  Dim Table As Object
        Set Table = Driver.FindElementByXPath("/html/body/div/form/div[4]/div[2]/div[4]/div[2]/div[1]/table/tbody/tr[3]/td[2]")
        Table.ClickDouble
        Table.Clear.SendKeys Range("I5").Value
     

End Sub


Nhưng co thể add được nếu chạy theo code này:


Mã:
Sub TEST1()

Dim ieApp As InternetExplorer
Dim ieDoc As Object
Dim NewURL As String

Set ieApp = New InternetExplorer
ieApp.Visible = True
        ieApp.navigate "https://www.vietcombank.com.vn/" 'go to login page http://nkvh.genco3.com/login.aspx

        Do While ieApp.Busy: DoEvents: Loop 'dynamic wait
        Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop 'dynamic wait =ieApp.readyState = 4 And Not ieApp.Busy: DoEvents: Loop '
Sleep 500
    Set ieDoc = ieApp.document
Set Datas = ieDoc.getElementById("Content_HomeSideBar_RatesBox_ExchangeRates_ExrateView").getElementsByTagName("td")(2)
Range("I4").Value = Datas.innerText
Datas.innerText = Range("I5").Value
Debug.Print Datas.innerText

MsgBox ("Done")
End Sub

Mong anh @HeSanbi giúp đỡ!
@gttrongvn anh có thể dùng Web: https://www.vietcombank.com.vn/ để test ! Như code em gửi ở trên! Cảm ơn anh!
IE thay đổi giá trị bằng cách thay đổi HTML của trang. IE thì quá nhiều Hạn chế
Selenium Sendkey để thêm giá trị nếu HTML có thể nhận giá trị.
Bạn đưa cái trang Vietcombank đấy thì Selenium sẽ Sendkey vào cái bảng tỷ giá như thế nào.

Không có website thì làm sao thử Code đây.

Để chạy chế độ Debuging: ConnectBrowser "chrome" (Hoặc "Coccoc" - Cần cài đặt Cốc Cốc)
 
Upvote 0
IE thay đổi giá trị bằng cách thay đổi HTML của trang. IE thì quá nhiều Hạn chế
Selenium Sendkey để thêm giá trị nếu HTML có thể nhận giá trị.
Bạn đưa cái trang Vietcombank đấy thì Selenium sẽ Sendkey vào cái bảng tỷ giá như thế nào.

Không có website thì làm sao thử Code đây.

Để chạy chế độ Debuging: ConnectBrowser "chrome" (Hoặc "Coccoc" - Cần cài đặt Cốc Cốc)

Em tưởng khi em chạy Code VBA - IE để thay đổi giá trị của Web VCB được thì Slenium cũng có thể!
1.> Vậy Selenium không thể add giá trị theo kiểu như IE - add giá trị "88" vào trang VCB hả anh ?
2.> Chạy chế độ Debuging: Tức là mình vẫn phải mở Chrome nên 1 lần hả anh? Mình có thể cho nó chạy ẩn luôn từ đầu được không anh?
Kiến thức lập trình của em không có! chủ yếu là bắt trước! Nên có nhiều chỗ em không hiểu!
Mong anh @HeSanbi giúp đỡ!
 
Upvote 0
Em tưởng khi em chạy Code VBA - IE để thay đổi giá trị của Web VCB được thì Slenium cũng có thể!
1.> Vậy Selenium không thể add giá trị theo kiểu như IE - add giá trị "88" vào trang VCB hả anh ?
2.> Chạy chế độ Debuging: Tức là mình vẫn phải mở Chrome nên 1 lần hả anh? Mình có thể cho nó chạy ẩn luôn từ đầu được không anh?
Kiến thức lập trình của em không có! chủ yếu là bắt trước! Nên có nhiều chỗ em không hiểu!
Mong anh @HeSanbi giúp đỡ!
Nếu bạn sử dụng Selenium Webdriver thì ẩn được. VBA chỉ hỗ trợ SeleniumBASIC.
Chế độ Debuging: code trên sẽ tự động kiểm tra Chrome đã khởi động chưa, chưa thì khởi động, nếu khởi động rồi thì tự động kết nối lại với post 9222.
 
Upvote 0
Upvote 0
Lỗi này là do driver chrome không tương thích. Bạn vào đây tải bản chromedriver mới về cho máy http://chromedriver.chromium.org/downloads . Sau khi tải về copy file đó bỏ vào thư mục bạn cài đặt SeleniumBasic. Cái web bạn đưa và nhờ chỉnh dữ liệu như thế thì mình chịu.
Em đã thử tải bản Chromedriver 72 về cho khớp với bản chrome 72 nhưng cũng không được anh @gttrongvn ơi!
Sao Selenium nó lại không cho sendkeys giá trị vào: Findelementbytag("td") anh ơi! em không biết tại sao nữa! Hix!
Bài đã được tự động gộp:

Nếu bạn sử dụng Selenium Webdriver thì ẩn được. VBA chỉ hỗ trợ SeleniumBASIC.
Chế độ Debuging: code trên sẽ tự động kiểm tra Chrome đã khởi động chưa, chưa thì khởi động, nếu khởi động rồi thì tự động kết nối lại với post 9222.
Dạ! Em cảm ơn anh @HeSanbi đã tận tình giúp em!
Em rất vui vì được biết thêm về Selenium Webdriver!
Nhưng em không hiểu sao Selenium lại không cho Sendkeys, add giá trị vào FindelementBytag("td"). huhu!
Liệu còn con đường khác để đi không anh!
Em có cảm giác Web HTML có 2 lớp!
+ Nếu em click chuột + add giá trị mới vào cell trên web thì sau khi add xong: Khi nhấp chuột vào cell đó, hoặc click Save là nó trở về giá trị cũ! không giữ được giá trị mới add!
+ Nếu em clickDoule + add giá trị vào cell trên web thì sau khi add xong lưu nó không bị mất! Nó giữ giá trị mới!
Em cảm ơn anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ! Em cảm ơn anh @HeSanbi đã tận tình giúp em!
Em rất vui vì được biết thêm về Selenium Webdriver!
Nhưng em không hiểu sao Selenium lại không cho Sendkeys, add giá trị vào FindelementBytag("td"). huhu!
Liệu còn con đường khác để đi không anh!
Em có cảm giác Web HTML có 2 lớp!
+ Nếu em click chuột + add giá trị mới vào cell trên web thì sau khi add xong: Khi nhấp chuột vào cell đó, hoặc click Save là nó trở về giá trị cũ! không giữ được giá trị mới add!
+ Nếu em clickDoule + add giá trị vào cell trên web thì sau khi add xong lưu nó không bị mất! Nó giữ giá trị mới!
Em cảm ơn anh!
Lập trình theo phương pháp "mò cua bắt cá" thì đến tết năm sau mới xong.
Nếu là Site nội bộ thì kêu ban quản trị Site cung cấp cho bạn các Hàm API.
Bạn thử cung cấp Hình ảnh trang web, Toàn bộ html ở dạng text lên đây.
Không thì bạn phải tự làm mà thôi.

Nếu site của bạn muốn giống Excel Online hoặc Google Spreadsheet thì nên dừng bước sớm
 
Upvote 0
Web KT
Back
Top Bottom