Проверьте, загружен ли файл, чтобы возобновить код - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть код, который позволяет мне войти на сайт с учетными данными.Я заменил их на скрытые1, скрытые2 и скрытые3 в коде для конфиденциальности.Код входа в систему на веб-сайте затем перейдите к конкретной странице, которая имеет два раскрывающихся списка.В первом списке, в котором есть четыре параметра (это четыре параметра), я выбираю параметр, после чего второй раскрывающийся список обновляется в соответствии со списком list1, но список List2 можно изменить, поскольку параметры неизвестны. Следующий шаг - щелкнутькнопка, которая переходит на другую страницу с двумя элементами, которые я нажал, чтобы экспортировать файл PDF.До сих пор все в порядке.

Проблема в том, что я поставил линию ожидания на 15 секунд, чтобы дождаться загрузки, и я ищу более эффективный способ проверить, загружен файл или нет, используя selenium vba.

Вот код

Private Sub Test()
Dim bot         As New Selenium.WebDriver
Dim sList1      As SelectElement
Dim sList2      As SelectElement
Dim By          As New By
Dim fso         As Object
Dim myFolder    As Object
Dim objFile     As Object
Dim fil         As String
Dim fn          As String
Dim dteFile     As Date
Dim n           As Integer
Dim x           As Integer
Dim j           As Integer

Const DOWNLOAD_DIRECTORY As String = "C:\Users\Future\Desktop\Files"
Set fso = CreateObject("Scripting.FileSystemObject")
If Len(Dir(DOWNLOAD_DIRECTORY, vbDirectory)) = 0 Then MkDir DOWNLOAD_DIRECTORY

With bot
    .SetPreference "download.default_directory", DOWNLOAD_DIRECTORY
    .SetPreference "download.directory_upgrade", True
    .SetPreference "download.prompt_for_download", False

    .Start "chrome", "http://primprep.emis.gov.eg"
    .Get "/"

    .FindElementById("ContentPlaceHolder1_TextBox1").SendKeys "hidden1"
    .FindElementById("ContentPlaceHolder1_TextBox3").SendKeys "hidden2"
    .FindElementById("ContentPlaceHolder1_TextBox2").SendKeys "hidden3"
    .FindElementById("ContentPlaceHolder1_Button2").Click

    .FindElementById("Button1").Click
    .Wait 1000
mLoop:
    n = n + 1
    If n = 5 Then Stop
    x = 0
sPoint:
    Set sList1 = .FindElementById("ContentPlaceHolder1_Dedara").AsSelect
    sList1.SelectByIndex n
    .Wait 2000
    Set sList2 = .FindElementById("ContentPlaceHolder1_Dschool").AsSelect

    For j = x + 1 To sList2.Options.Count
        If x + 1 >= sList2.Options.Count Then GoTo mLoop

        fil = Format(n, "00") & "-" & Format(j, "00") & "-" & Application.Trim(sList2.Options(j + 1).Text) & ".pdf"
        sList2.SelectByIndex j
        .FindElementById("ContentPlaceHolder1_Button1").Click
        .Wait 2000

        If .IsElementPresent(By.ID("ContentPlaceHolder1_Label2")) Then
            If .FindElementById("ContentPlaceHolder1_Label2").Text = "لا يوجد بيانات لعرضها" Then
                Debug.Print "No Data For This School >> " & Application.Trim(Replace(fil, ".pdf", ""))
                x = x + 1
                GoTo sPoint
            End If
        End If

        Do
        Loop While .FindElementsById("IconImg_CrystalReportViewer1_toptoolbar_print").Count = 0
        .FindElementById("IconImg_CrystalReportViewer1_toptoolbar_print").Click

        Do
        Loop While .FindElementsByCss("[id^='theBttnbobjid']").Count = 0
        .FindElementByCss("[id^='theBttnbobjid']").Click
        Application.Wait Now + TimeSerial(0, 0, 15)

        'I need a way to check if the file downloaded or not instead of waiting for 15 seconds
        'as sometimes the file took no time and sometimes the file may took over 15 seconds

        Set myFolder = fso.GetFolder(DOWNLOAD_DIRECTORY)
        dteFile = DateSerial(1900, 1, 1)
        For Each objFile In myFolder.Files
            If objFile.DateLastModified > dteFile And fso.GetExtensionName(objFile.Path) = "pdf" Then
                dteFile = objFile.DateLastModified
                fn = objFile.name
            End If
        Next objFile
        If fn <> vbNullString And Not fso.FileExists(DOWNLOAD_DIRECTORY & "\" & fil) Then
            fso.MoveFile DOWNLOAD_DIRECTORY & "\" & fn, DOWNLOAD_DIRECTORY & "\" & fil
        End If

        .FindElementById("ContentPlaceHolder1_Button2").Click
        .Wait 2000
        x = x + 1
        GoTo sPoint
    Next j

    GoTo mLoop
End With
End Sub

Я искал такую ​​тему и нашел ссылку, но она была для селена Java.И мне нужно разобраться с селеном VBA.Привет

1 Ответ

0 голосов
/ 25 декабря 2018

вы можете проверить количество файлов в DOWNLOAD_DIRECTORY перед загрузкой кода процедуры, а затем проверить снова после него.Если количество увеличилось на единицу, значит, оно загружается.просто IDEA

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

Sub Attfiles()

    Dim AttFolder As String, path As String, count As Integer
    AttFolder = "D:\attdata"

    path = AttFolder & "\*.xls" 'ممكن تغير الامتداد هنا

    Filename = Dir(path)

    Do While Filename <> ""
       count = count + 1
        Filename = Dir()
    Loop

    Range("A5").Value = count
End Sub
...