无法通过selenium VBA从excel中的列表输入数据

无法通过selenium VBA从excel中的列表输入数据,excel,vba,selenium,selenium-webdriver,Excel,Vba,Selenium,Selenium Webdriver,我有一个网站“”,在这里我需要输入IEC代码-我有不同的端口可供选择(这是我发现的困难),然后需要在下面输入发货单(同样取自excel) IEC规范 039203249 039203249 端口 INBOM4(孟买航空货运) 那格布尔因格普6号酒店 运单编号 3963373 3954544 我已经编写了代码,但是在选择这些端口名时发现有困难 Option Explicit Public Sub Shippingdetails() ' Entering IEC code

我有一个网站“”,在这里我需要输入IEC代码-我有不同的端口可供选择(这是我发现的困难),然后需要在下面输入发货单(同样取自excel)

IEC规范

  • 039203249

  • 039203249

    端口

  • INBOM4(孟买航空货运)

  • 那格布尔因格普6号酒店

运单编号

  • 3963373

  • 3954544

我已经编写了代码,但是在选择这些端口名时发现有困难

    Option Explicit
    Public Sub Shippingdetails()   ' Entering IEC code and port number

    Dim bot As WebDriver
    Dim count As Long

    Set bot = New WebDriver
    bot.Start "Chrome"
    count = 1
    While (Len(Range("A" & count)) > 0)

    bot.Get "http://dgftcom.nic.in/licasp/sbdetformnew.asp"
    bot.FindElementByXPath("//input[@type='text'][@name='D5']").SendKeys Range("A" & count)
    bot.FindElementByXPath("//*[@id='AutoNumber1']/tbody/tr[7]/td[3]/font").AsSelect.SelectByText Range("B" & count)
    bot.FindElementByXPath("//input[@type='text'][@name='T5']").SendKeys Range("C" & count)
    bot.FindElementById("button1").Click


    Range("D" & count) = bot.FindElementByXPath("//html/body/div/center/div/table[4]/tbody/tr[2]/td[7]/font").Text


    'Range("E" & count) = bot.FindElementByCss("table td[8], table + font").Text
    Range("E" & count) = bot.FindElementByXPath("/html/body/div/center/div/table[4]/tbody/tr[2]/td[8]/font/b")

    'bot.Wait 1000
    count = count + 1
    Wend
    bot.Quit
    End Sub
最后,我需要提取“文件编号和日期”和“状态”
请帮助我。

请尝试下面的
xpath
进行选择

bot.FindElementByXPath("//select[@name='D8']").AsSelect.SelectByText Range("B" & count)
我建议使用
SelectByValue

bot.FindElementByXPath("//select[@name='D8']").AsSelect.SelectByValue "INBLR4" 

要处理此错误,请尝试以下操作。检查元素计数>0

If  bot.FindElementsByXPath("//html/body/div/center/div/table[4]/tbody/tr[2]/td[7]/font").Count >0 Then
     Range("D" & count) = bot.FindElementByXPath("//html/body/div/center/div/table[4]/tbody/tr[2]/td[7]/font").Text

 If  bot.FindElementsByXPath("/html/body/div/center/div/table[4]/tbody/tr[2]/td[8]/font/b").Count >0 Then
     Range("E" & count) = bot.FindElementByXPath("/html/body/div/center/div/table[4]/tbody/tr[2]/td[8]/font/b").Text

请尝试在下面
xpath
进行选择

bot.FindElementByXPath("//select[@name='D8']").AsSelect.SelectByText Range("B" & count)
我建议使用
SelectByValue

bot.FindElementByXPath("//select[@name='D8']").AsSelect.SelectByValue "INBLR4" 

要处理此错误,请尝试以下操作。检查元素计数>0

If  bot.FindElementsByXPath("//html/body/div/center/div/table[4]/tbody/tr[2]/td[7]/font").Count >0 Then
     Range("D" & count) = bot.FindElementByXPath("//html/body/div/center/div/table[4]/tbody/tr[2]/td[7]/font").Text

 If  bot.FindElementsByXPath("/html/body/div/center/div/table[4]/tbody/tr[2]/td[8]/font/b").Count >0 Then
     Range("E" & count) = bot.FindElementByXPath("/html/body/div/center/div/table[4]/tbody/tr[2]/td[8]/font/b").Text

你可以跳过表单直接进入结果页面,浏览器自动化在我使用它的时候从来没有这么好用过

以下函数与IEC、EDI和BillNumber一起提供时,将返回包含结果的HTMLDocument

下面的
子主菜单将把所需数据打印到即时窗口。我不确定如何对函数的结果使用XPath,所以我只是硬编码了位置

Public Function GetDetail(ByVal IEC As String, ByVal EDI As String, ByVal ShippingBillNumber As String) As Object
Dim Request As Object: Set Request = CreateObject("MSXML2.serverXMLHTTP")
Dim Result As Object: Set Result = CreateObject("htmlfile")

Request.Open "POST", "http://dgftcom.nic.in/licasp/newsbdet.asp", False
Request.setRequestHeader "content-type", "application/x-www-form-urlencoded"
Request.send "D5=" & IEC & "&D8=" & EDI & "&T5=" & ShippingBillNumber & "&button1=SB-Detail"
Result.body.innerHTML = Request.responseText

Set GetDetail = Result
End Function


Sub Main()
Dim x As Object
Dim Data As Object
Set x = GetDetail("0392032449", "INBOM4", "3963373")
Set Data = x.getElementsByTagName("table")(4).getElementsByTagName("tr")(1).getElementsByTagName("td")
Debug.Print "Date: " & Split(Data(6).innerText, vbNewLine)(1)
Debug.Print "Status:" & Data(7).innerText
End Sub

你可以跳过表单直接进入结果页面,浏览器自动化在我使用它的时候从来没有这么好用过

以下函数与IEC、EDI和BillNumber一起提供时,将返回包含结果的HTMLDocument

下面的
子主菜单将把所需数据打印到即时窗口。我不确定如何对函数的结果使用XPath,所以我只是硬编码了位置

Public Function GetDetail(ByVal IEC As String, ByVal EDI As String, ByVal ShippingBillNumber As String) As Object
Dim Request As Object: Set Request = CreateObject("MSXML2.serverXMLHTTP")
Dim Result As Object: Set Result = CreateObject("htmlfile")

Request.Open "POST", "http://dgftcom.nic.in/licasp/newsbdet.asp", False
Request.setRequestHeader "content-type", "application/x-www-form-urlencoded"
Request.send "D5=" & IEC & "&D8=" & EDI & "&T5=" & ShippingBillNumber & "&button1=SB-Detail"
Result.body.innerHTML = Request.responseText

Set GetDetail = Result
End Function


Sub Main()
Dim x As Object
Dim Data As Object
Set x = GetDetail("0392032449", "INBOM4", "3963373")
Set Data = x.getElementsByTagName("table")(4).getElementsByTagName("tr")(1).getElementsByTagName("td")
Debug.Print "Date: " & Split(Data(6).innerText, vbNewLine)(1)
Debug.Print "Status:" & Data(7).innerText
End Sub

上面的例子我什么都没有<代码>无装运清单详细信息,装运清单编号:3963373请检查港口代码/IEC/SB编号的正确性。
以上示例中,我没有得到任何信息<代码>无货运单详细信息可用于货运单编号:3963373请检查港口代码/IEC/SB编号的正确性。
现在我在039203249(IEC)编号、INRXLB(港口编号)、3953800(SB编号)中遇到了困难。在这里,我得到了“无货运信息”,代码卡在那里。它不会在excel的下一个单元格中搜索其他单元格。我必须使用“如果其他状态”吗?@AmitShah:检查是否有帮助。嘿,非常感谢,我也用同样的方式尝试过,而且成功了。现在我将尝试通过CSS选择器方法,这样整个过程会快得多。现在我在039203249(IEC)号、INRXLB(端口号)、3953800(SB号)中遇到困难。在这里,我得到了“没有可用的装运信息”,代码卡在那里。它不会在excel的下一个单元格中搜索其他单元格。我必须使用“如果其他状态”吗?@AmitShah:检查是否有帮助。嘿,非常感谢,我也用同样的方式尝试过,而且成功了。现在我将尝试使用CSS选择器方法,这样整个过程会快得多。这是一个很好的尝试,但我很少使用MSXML方法。这就是我要做的,但是,我再次发现添加Xpath或其他提取方法有困难,我肯定明天会尝试。非常感谢您的支持,晚安。这是一个很好的回答,但我很少使用MSXML方法。这就是我要做的,但是,我再次发现添加Xpath或其他提取方法有困难,我肯定明天会尝试。非常感谢你的支持,晚安。