我想用硒vba

时间:2019-07-17 03:34:29

标签: vba selenium web-scraping

我有一个预先填写的数据的网络表格,我必须填写。我想用javascript做到这一点。我不确定要编写代码。

Public Sub ABC()
    Dim document As HTMLDocument
    Dim bot As New WebDriver
    Dim  cSCRIPT,m
    m=58
    bot.Start "chrome", ""
    bot.Get "https://XYZ"
  cSCRIPT = "document.getElementByXPath("//td[contains(text(),'XXXX')]/following-sibling::td[5]").value='" & m & "'"
 bot.ExecuteScript cSCRIPT

但是我的代码不起作用。如何借助XPath在Selenium VBA中进行编码,以将数据填充到Web表中。

2 个答案:

答案 0 :(得分:2)

我无法在VBA中对此进行测试,但已从有效的python进行了翻译。我使用evaluate处理xpath匹配。

函数Document.evaluate()具有以下定义:

var xpathResult = document.evaluate(
  xpathExpression,
  contextNode,
  namespaceResolver,
  resultType,
  result
);

第一个参数是xpath表达式。那么contextNode基本上是将xpath应用于document的节点。 namespaceResolvernull,因为未使用名称空间前缀(这是html文档)。我将resultType指定为XPathResult.ANY_TYPE,以便从表达式中获取自然类型。对于result参数,我传递了null,以便创建一个新的XPathResult

返回类型为object。我使用iterateNextinput元素,然后用input.value = "abc";分配视觉值,并用input.setAttribute('value', 'xyz');分配实际值。

我正在使用一个可测试的示例,但您将按照html进行修改,这意味着您的xpath将是

//td[contains(text(),'XXXX')]/following-sibling::td[5]/input

VBA:

Dim s As String
s = "var td = document.evaluate(""//tr[contains(td/text(), 'Angelica Ramos')]/td[2]/input"", document, null, XPathResult.ANY_TYPE, null);" & _
    "var input = td.iterateNext();" & _
    "input.value = 'abc';" & _
    "input.setAttribute('value', 'xyz');"

bot.Get 'https://datatables.net/examples/api/form.html'
bot.ExecuteScript s

Python原始版本:

bot.get('https://datatables.net/examples/api/form.html')

s = '''var td = document.evaluate("//tr[contains(td/text(), 'Angelica Ramos')]/td[2]/input", document, null, XPathResult.ANY_TYPE, null);     
       var input = td.iterateNext();
       input.value = 'abc';
       input.setAttribute('value', 'xyz');
'''
bot.execute_script(s)


参考文献:

  1. https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate#Result_types
  3. https://javascript.info/object
  4. https://developer.mozilla.org/en-US/docs/Web/API/XPathResult/singleNodeValue
  5. https://developer.mozilla.org/en-US/docs/Web/API/XPathResult/iterateNext

答案 1 :(得分:0)

调试XPath很难不看到网页的表格和底层HTML,但是通常如果表格难以访问,我只是使用AppRobotic这样的宏工具来利用表格的屏幕X,Y坐标进行点击并填写必要的信息,有时在表格中使用键盘笔触进行导航也很有效:

Set Waiter = CreateObject("Selenium.Waiter")
Set Assert = CreateObject("Selenium.Assert")
Set bot = CreateObject("Selenium.FirefoxDriver")
Set x = CreateObject("AppRobotic.API")
Sub ABC
    ' Open webpage
    bot.Get "https://www.google.com"
    ' Wait a couple of seconds
    x.Wait(2000)
    ' Type in the Search box
    bot.FindElementByName("q").SendKeys "test"
    bot.Keys.Return
    ' Or use coordinates if an element is difficult to find
    ' Use UI Item Explorer to get X,Y coordinates of Search box and move cursor
    x.MoveCursor(438, 435)
    ' click inside Search box
    x.MouseLeftClick
    x.Type("test")
    x.Type("{ENTER}")
    While Waiter.Not(Instr(bot.Title, "test")): Wend
    x.MessageBox("Click OK to quit the browser"):
    bot.Quit
End Sub