Программа Excel VBA для интеграции HTML-ссылок после входа в систему - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть веб-сайт, который я пытаюсь интегрировать с помощью VBA через Excel.У меня отключен процесс входа в систему, но после входа в систему программа по-прежнему ссылается на экран входа в систему, когда, например, я ищу все имена тегов "div".Это происходит потому, что сайт не загружается в традиционном смысле;адрес один и тот же, независимо от того, на что нажимали, и если вы запустите:

Do
DoEvents
Loop Until ie.readystate = 4

сразу после нажатия кнопки, чтобы войти в систему, на первой итерации он будет равен 4.

В проблеме, которая, по-видимому, связана с этим, действия, выполненные хорошо после входа в систему, ссылаются на текст HTML экрана входа в систему.Вот мой код:

Sub WebpageFiller()
Dim ie As SHDocVw.InternetExplorer
Set ie = New SHDocVw.InternetExplorer
ie.Visible = True
ie.navigate "(website here)"
Do
DoEvents
Loop Until ie.readyState = 4
'varUsername = InputBox("Username?")
'varPassword = InputBox("Password?")
varUsername = "(username)"
varPassword = "(password)"
Call ie.document.getElementById("txtUsername").setAttribute("value", varUsername)
Call ie.document.getElementById("txtPassword").setAttribute("value", varPassword)
Call ie.document.getElementById("btnLogin").Click

Application.Wait (Now + TimeValue("00:00:05"))
Do
DoEvents
Loop Until ie.readyState = 4
ie.Refresh
Debug.Print ("refresh passed")
Do
DoEvents
Loop Until ie.readyState = 4
Application.Wait (Now + TimeValue("00:00:05"))

Dim i As Integer
i = 0
Set divElements = ie.document.getElementsByTagName("div")
Do Until divElements(i).Title = "Collapse menu"
i = i + 1
Loop
divElements(i).Click

End Sub

Первый раздел (с помощью нажатия «btnLogin») работает просто отлично, но даже когда я жду несколько секунд, намного дольше, чем загрузка следующей страницы,Цикл divElements будет ссылаться на HTML-код страницы входа.Кроме того, команда ie.Refresh даже не работает.Каким-то образом это сработало один раз, а когда это сработало, оно обновило страницу, а все остальное прошло гладко.

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

Вот фрагмент HTML-кода после входа в систему:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- Always force latest IE rendering engine or request Chrome Frame -->
    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
    <title>[Page title]</title>

    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta content="width=device-width, initial-scale=1.0" name="viewport" />
    <meta content="" name="description" />
    <meta content="" name="author" />
    <meta name="MobileOptimized" content="320" />

    <script type="text/javascript">
        document.write('<script src="js/loadPlugins.js?v=' + (new Date).getTime() + '" type="text/javascript"><\/script>');
    </script>
    <script type="text/javascript">
        document.write('<script src="js/main.js?v=' + (new Date).getTime() + '" type="text/javascript"><\/script>');
    </script>
</head>


<body class="page-header-fixed page-sidebar-closed-hide-logo page-content-white">
    <div id="ucHeader"
        path="MenuHeaderFooter"
        controlname="Header"
        loadasync="true">
    </div>
    <div class="clearfix"></div>
    <div class="page-container">
        <div id="ucLeftMenu"
            path="MenuHeaderFooter"
            controlname="LeftMenu"
            loadasync="true"
            style="height: 0px;">
        </div>
        <div class="page-content-wrapper">
            <div class="page-content">
                <div id="ucMainContent" style="margin-bottom: 0px;"></div>
            </div>
        </div>
    </div>
    <div id="ucFooter"
        path="MenuHeaderFooter"
        controlname="Footer"
        loadasync="true">
    </div>

    <script>
        $(document).ready(function () {
            storeSecurityProfile({
                methodName: 'GetSecurityLevelsOfCurrentUser'
                , viewField: 'SecurityViewText'
                , levelField: 'SecurityLevel'
            });

            var params = getQueryStringParameters();
            $.each(params, function (paramName, paramValue) {
                params[paramName.toLowerCase()] = paramValue;
            });
            var path = params.p;
            delete params.p;
            var controlName = params.uc;
            delete params.uc;
            var loadType = params.loadtype;
            delete params.loadtype;
            var title = replaceAll(params.title, '%20', ' ');

            var numLoaded = 0;

            $('#ucHeader').fetchSmartControl({
                onLoad: function () {
                    numLoaded++;
                    onLoad();
                }
            });
            $('#ucLeftMenu').fetchSmartControl({
                onLoad: function () {
                    numLoaded++;
                    onLoad();
                }
            });
            $('#ucFooter').fetchSmartControl({
                onLoad: function () {
                    numLoaded++;
                    onLoad();
                }
            });

            function onLoad() {
                if (numLoaded === 3) {
                    Layout.fixContentHeight();

                    if (path && controlName) {
                        // gkb 04/22/16 - only relevant if we're loading the menu dynamically and asynchronously
                        //if (typeof IsMenuLoaded === 'function') {
                        //    // check n times (with x interval) to see if dynamic menu is done loading
                        //    // -if menu loads within n attempts, try to load menu item for path/controlName passed in
                        //    // -if menu does not load within n attempts, or if path/controlName not found in loaded menu, load ucMainContent with path/controlName
                        //    var numAttempts = 0;
                        //    var maxAttempts = 5;
                        //    var interval = 500;
                        //    var menuLoaded;
                        //    TryLoadMenuItem();
                        //}
                        //else {
                        //    LoadMainContent();
                        //}
                        TryLoadMenuItem();

                        function TryLoadMenuItem() {
                            setTimeout(function () {

                                // gkb 04/22/16 - only relevant if we're loading the menu dynamically and asynchronously
                                //menuLoaded = IsMenuLoaded();
                                menuLoaded = true;
                                numAttempts++;

                                if (menuLoaded) {
                                    var pageLoaded = LoadMenuItem(path, controlName, {
                                        params: params
                                        , loadType: loadType
                                    });

                                    if (!pageLoaded) {
                                        LoadMainContent();
                                    }
                                }
                                else if (numAttempts < maxAttempts) {
                                    TryLoadMenuItem();
                                }
                                else {
                                    LoadMainContent();
                                }
                            }, interval);
                        }
                        function LoadMainContent() {
                            $('#ucMainContent').fetchSmartControl({
                                path: path
                                , controlName: controlName
                                , params: params
                                , loadType: loadType || 'Default'
                                , title: title
                            });
                        }
                    }
                }
            }
        });
    </script>
</body>
</html>

И до входа в систему:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="shortcut icon" href="/favicon.ico" />
    <title>
	[Title]
</title><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta content="width=device-width, initial-scale=1.0" name="viewport" /><meta name="description" /><meta name="author" /><meta name="MobileOptimized" content="320" />
    
    <script type="text/javascript">
        document.write('<script src="js/loadPlugins.js?v=' + (new Date).getTime() + '" type="text/javascript"><\/script>');
    </script>
    <script type="text/javascript">
        document.write('<script src="js/main.js?v=' + (new Date).getTime() + '" type="text/javascript"><\/script>');
    </script>
</head>

<body class="login">
    <div id="ucMainContent"></div>

    <script type="text/javascript">
        window.onload = function () {
            $('#ucMainContent').fetchSmartControl({
                path: 'Home'
                , controlName: 'Login'
            });
        };
    </script>
</body>
</html>

Первый найденный в моем коде «div» возвращает пустой заголовок и идентификатор «ucMainContent», поэтому он определенно смотрит на экран входа в систему.

1 Ответ

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

Так что я, кажется, нашел решение для этого, и это странно.Когда я заходил на сайт, открывалась вторая версия IE, которую можно просмотреть в диспетчере задач.Переменная «ie» будет продолжать ссылаться на первый (теперь невидимый) экземпляр, который, похоже, остался на странице входа в систему, в то время как тот, который отображается в веб-браузере, перешел на следующую страницу.Мне пришлось использовать следующий код для переключения между экземплярами IE, чтобы выбрать правильную страницу:

Dim i As Variant
i = 0
Dim Get_IE_Window2 As SHDocVw.InternetExplorer
Set Get_IE_Window2 = Nothing
Dim newIe As Object
Dim Shell As Object
Set Shell = CreateObject("Shell.Application")
Debug.Print (Shell.Windows.Count)
While i < Shell.Windows.Count And Get_IE_Window2 Is Nothing
    Set newIe = Shell.Windows.Item(i)
    If Not newIe Is Nothing Then
        Debug.Print newIe.LocationURL, newIe.LocationName
        If TypeName(newIe) = "IWebBrowser2" Then
            If TypeOf newIe Is SHDocVw.InternetExplorer And newIe.LocationURL <> "[login page url]" And InStr(newIe.LocationURL, "file://") <> 1 Then
                Set Get_IE_Window2 = newIe
            End If
        End If
    End If
    i = i + 1
Wend
Set ie = Get_IE_Window2

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

Дайте мне знать, если мне что-то нужно уточнить в этом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...