Selenium 宏在给出“Echo is On”之前成功粘贴数据数千次迭代

问题描述 投票:0回答:1

我创建了一个 VBA 宏,它使用 selenium 访问网站并将输入粘贴到多个字段中,并通过复制 Excel 工作表中的文件路径来上传一些文件。它有一个 for 循环,因此需要执行数千次。

我在我的一台计算机上使用它,在开始为其中一个文件路径粘贴“echo is on”而不是循环迭代之一上的文件路径之前,它在前 20 次左右工作得非常完美。奇怪的是,即使在循环的迭代中,它也会在执行此操作之前成功粘贴多个其他值。

我在另一台计算机上的同一个电子表格上尝试了相同的代码,问题似乎消失了。我又运行了该宏 1,000 次迭代,它工作完美,但随后仍然开始为同一个文件路径单元格再次粘贴“回显已打开”。

这是我的代码,如果有帮助的话


Option Explicit

Dim MyBrowser As New Selenium.ChromeDriver

Sub SubmitTheHungryJPEGLoop()

Dim i
Dim strFilePath
Dim firstimageupload
Dim zipupload
Dim WshShell
Dim secondimageupload
Dim PinterestPin
Dim AddTitle
Dim AddDescription
Dim SubmissionCategory
Set MyBrowser = New Selenium.ChromeDriver
Dim iframeelement As WebElement
Dim noError As Boolean ' Define noError as a boolean variable

               
MyBrowser.Start baseUrl:="example.com"
MyBrowser.Get "https://example.com"
Application.Wait DateAdd("s", 35, Now)
MyBrowser.FindElementByXPath("/html/body/div[1]/header/div[1]/div[2]/div/div[2]/ul/li[1]/a[1]").Click
Application.Wait DateAdd("s", 3, Now)

MyBrowser.FindElementByXPath("/html/body/div[2]/div/div/div[1]/form/div[4]/input").SendKeys "myloginemail"
MyBrowser.FindElementByXPath("/html/body/div[2]/div/div/div[1]/form/div[5]/input").SendKeys "mypassword"

MyBrowser.FindElementByXPath("/html/body/div[2]/div/div/div[1]/form/div[7]/button").Click

For i = 4 To 10

linek:
noError = True
On Error GoTo linej:




AddTitle = Sheet1.Cells(i, 1).Value


AddDescription = Sheet1.Cells(i, 4).Value

firstimageupload = Sheet1.Cells(i, 2).Value

PinterestPin = Sheet1.Cells(i, 29).Value
SubmissionCategory = Sheet1.Cells(i, 22).Value

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo " & firstimageupload & "| clip", 0, True

Application.Wait DateAdd("s", 15, Now)
MyBrowser.Get "https://thehungryjpeg.com/add_product"

Application.Wait DateAdd("s", 20, Now)
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[1]/div/div[1]/ul/li/div/div[2]/input").ClickAndHold


MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[1]/div/div[1]/ul/li/div/div[2]").Click

Application.Wait DateAdd("s", 2, Now)

WshShell.SendKeys "^{v}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{ENTER}"
Application.Wait DateAdd("s", 2, Now)


MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[1]/input").SendKeys AddTitle

MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[1]/select").Click

WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"

If SubmissionCategory = "Shapes" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If

If SubmissionCategory = "Quotes" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
If SubmissionCategory = "Animals" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
If SubmissionCategory = "Sublimation" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
If SubmissionCategory = "Travel" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
If SubmissionCategory = "Holiday" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
If SubmissionCategory = "People" Then
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[2]/div/div[2]/select").Click
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{DOWN}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{ENTER}"
End If
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[6]/div/div[14]/input").Click
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[6]/div/div[13]/input").Click
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[6]/div/div[4]/input").Click
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[6]/div/div[10]/input").Click

MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[3]/div/input").SendKeys "2"


zipupload = Sheet1.Cells(i, 3).Value
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[7]/div/div/input").Click


MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[2]/div/div[9]/div").Click
WshShell.Run "cmd.exe /c echo " & zipupload & "| clip", 0, True
Application.Wait DateAdd("s", 2, Now)

WshShell.SendKeys "^{v}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{ENTER}"
Application.Wait DateAdd("s", 2, Now)

Set iframeelement = MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[1]/div[1]/div/div[2]/div[1]/div/div/iframe")
MyBrowser.SwitchToFrame iframeelement

MyBrowser.FindElementByXPath("/html/body").SendKeys AddDescription
MyBrowser.SwitchToParentFrame
Application.Wait DateAdd("s", 4, Now)
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[2]/button[2]").Click
MyBrowser.FindElementByXPath("/html/body/div[1]/div/section/form/div/div[2]/button[2]").Click
WshShell.Run "cmd.exe /c echo " & firstimageupload & "| clip", 0, True

If noError Then ' Check if no error occurred
GoTo linel:
End If

linej:
On Error GoTo -1
WshShell.SendKeys "^{ENTER}"
Application.Wait DateAdd("s", 2, Now)
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{ENTER}"
Application.Wait DateAdd("s", 2, Now)
Application.Wait DateAdd("s", 10, Now)
WshShell.SendKeys "{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "^{TAB}"
Application.Wait DateAdd("s", 2, Now)
WshShell.SendKeys "{ENTER}"
GoTo linek:
linel:
Next
End Sub

















有人对如何解决这个问题有任何想法吗?我确实查看了“查看 Stack Overflow 上已有的问题,看看您的问题是否重复”下的帖子。部分看看是否有解决方案,但那些似乎与 VBA 无关,也没有讨论程序运行一段时间然后由于某种原因停止的情况。

我尝试在不同的计算机上进行测试,效果不错。我还尝试将代码部分移到更高的位置,看看是否有任何改变,但没有改变。

excel vba windows for-loop selenium-webdriver
1个回答
0
投票

除了剪贴板建议之外:您的代码中有一个常见模式“发送键 n 次然后发送 ENTER”,可以将其分解为子代码并大大减少主代码的体积。

分解代码:

Sub SendKeyNTimesThenEnter(objShell As Object, k As String, n As Long)
    Dim i As Long
    For i = 1 To n
        objShell.SendKeys k
        Application.Wait DateAdd("s", 2, Now)
    Next i
    WshShell.SendKeys "^{ENTER}"
    Application.Wait DateAdd("s", 2, Now)
End Sub

使用示例:

'5 x "down", then "enter"
SendKeyNTimesThenEnter WshShell, "{DOWN}", 5

'2 x "tab", then "enter"
SendKeyNTimesThenEnter WshShell, "{TAB}", 2
© www.soinside.com 2019 - 2024. All rights reserved.