VBA - Не удается получить данные, переданные на веб-сайт - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь передать данные в форму, которая находится на четвертой странице.Я успешно прошел через макрос, выполнив вход, выполняя поиск конкретной страницы на основе введенных данных, переходя на эту конкретную страницу и вытягивая форму, в которой я хочу вводить данные в несколько мест.

Sub Test()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "http://mywebsite.com/Pages/MainSite/Default.aspx"
    Do While IE.Busy
        Application.Wait DateAdd("s", 1, Now)
    Loop
    IE.document.getElementById("txtUserName").Value = "dummyusername"
    IE.document.getElementById("txtPassword").Value = "password"
    IE.document.getElementById("btnLogin").Click
End Sub

Sub Next2()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "mywebsite.com/pages/hr/TimeEntryDashboard.aspx"
    Do While IE.Busy
        Application.Wait DateAdd("s", 2, Now)
    Loop
    IE.document.getElementById("MainContent_MainContent_txtStartDateFilter").Value = "10/13/2018"
    IE.document.getElementById("MainContent_MainContent_txtEmployeeNameFilter").Value = "122631"
    IE.document.getElementById("MainContent_MainContent_btnFind").Click
End Sub

Sub Next3()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "mywebsite.com/pages/hr/TimeAndInspectionWizard.aspx?id=0245b750-4cde-47da-a754-fb7f8bfecfc9"
    Do While IE.Busy
        Application.Wait DateAdd("s", 1, Now)
    Loop
    IE.document.getElementById("imgGridTimeDetailsArrow0").Click
    IE.document.getElementById("MainContent_MainContent_tcMain_tpValidation_rptInspectionDetails_imbGridInspectionDetailsOptionsAdd_0").Click
End Sub

Sub Next4()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
  ' IE.Visible = True
  ' IE.Navigate "mywebsite.com/pages/hr/TimeAndInspectionWizard.aspx?id=0245b750-4cde-47da-a754-fb7f8bfecfc9"
    Do While IE.Busy
        Application.Wait DateAdd("s", 2, Now)
    Loop
    IE.document.getElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtInspectionDetailsLotNumber").Value = "12345"
    IE.document.getElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtInspectionInspectedQuantity").Value = "1"
    IE.document.getElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtGoodWithoutReworkQuantity").Value = "1"
    IE.document.getElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtAddInspectionResult").Click
End Sub

Эта часть выше вызывает ошибку в первом разделе, где предполагается ввод данных на экран.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы не указали ошибку или не показали HTML.Возможно, ваш элемент находится в родительском фрейме / iframe.

  1. Вы действительно хотите дождаться загрузки страницы While .Busy Or .readyState < 4: DoEvents: Wend.Если вы присоединяетесь к своим подчиненным элементам, вам это понадобится после каждого .Click/.Submit/.Navigate
  2. . Если это проблема синхронизации, то вы можете использовать таймер цикла, как показано на рисунке, для цикла до набора элементов или тайм-аута - чтобы избежать бесконечностиloop
  3. Вы хотите проверить, был ли установлен элемент
  4. Вы хотите, чтобы попытка назначить ссылку на объект, заключенную в On Error Resume Next, поддерживала выполнение кода и не позволяла пользователям видеть ошибкусообщения, если элемент не задан.
  5. Ваш вопрос касается первой части, поэтому я обратился к нему, но я повторяю мнение в комментариях о том, что вам нужен только один экземпляр IE, и он должен работать с этим, если эти подпрограммы не связаны ибегать самостоятельно.Вы все еще можете подумать, можно ли их объединить в этом случае, используя один экземпляр.

VBA:

Option Explicit
Public Sub LoopUntilSet()
    Dim IE As New InternetExplorer, t As Date
    Const MAX_WAIT_SEC As Long = 5

    With IE
        .Visible = True
        .navigate "yourURL"

        While .Busy Or .readyState < 4: DoEvents: Wend

        t = Timer
        Do While x Is Nothing
            DoEvents
            On Error Resume Next
            Set ele = .document.getElementById("txtUserName")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop

        If ele Is Nothing Then
            Exit Sub
        Else
            ele.Value = "dummyusername"
            'other code
        End If
        .Quit
    End With
End Sub
0 голосов
/ 16 октября 2018

Вы должны проверить, существует ли элемент как часть проверки кода, и это также приведет к более точному выявлению проблемы.Вот ваш код, переписанный с проверкой, например.

Sub Next4()
    Dim IE As Object, Elem As Object
    Set IE = CreateObject("InternetExplorer.Application")

    With IE
        Do While .Busy
            Application.Wait DateAdd("s", 2, Now)
        Loop

        With .document

            Set Elem = .GetElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtInspectionDetailsLotNumber")
            If Not Elem is nothing Then
                Elem.Value = "12345"
                Set Elem = Nothing
            End If

            Set Elem = .GetElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtInspectionInspectedQuantity")
            If Not Elem is nothing Then
                Elem.Value = "1"
                Set Elem = Nothing
            End If

            Set Elem = .GetElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtGoodWithoutReworkQuantity")
            If Not Elem is nothing Then
                Elem.Value = "1"
                Set Elem = Nothing
            End If

            Set Elem = .GetElementById("MainContent_MainContent_tcMain_tpInspectionDetails_txtAddInspectionResult")
            If Not Elem is nothing Then
                Elem.Click
            Else
                MsgBox "Can't Click as Element Missing : " & "MainContent_MainContent_tcMain_tpInspectionDetails_txtAddInspectionResult"
            End If
       End With
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...