У меня есть веб-сайт, который я пытаюсь интегрировать с помощью 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», поэтому он определенно смотрит на экран входа в систему.