Что нового

Как произвести все действия в одном окне?

Anna

Новичок
Сообщения
119
Репутация
2
Подскажите, пожалуйста, как сделать, чтобы авторизация и последующие действия производились в одном окне.
Код:
#Include <Clipboard.au3>

#include <IE.au3>

HotKeySet('{Esc}', '_Exit')

;$flag_0 = StringInStr(ClipGet(), "а") ? 1 : 0
While 1
$flag_0 = StringInStr(ClipGet(), "а") ? 1 : 0
 If  $flag_0 Then _test_func()
sleep(100)
WEnd
Func _test_func()
Local $oIE, $oForm, $oQuery, $sUrl , $sLogin = 'Anna', $sPass = '333444'

$flag = StringInStr(ClipGet(), "Любовь") ? 1 : 0
$flag2 = StringInStr(ClipGet(), "Здание") ? 1 : 0
;select url
If $flag Then
    $sUrl = 'http://ruforum.mt5.com/threads/3101-a-kto-nibud-pishet-stihi'


ElseIf $flag2 Then
    $sUrl = 'http://ruforum.mt5.com/threads/56867-prodayu-to-ne-znayu-chto'

EndIf
;start_autorisation
$oIE = _IECreate($sUrl)
$oForm = _IEFormGetCollection($oIE, 0)
$oQuery = _IEFormElementGetCollection($oForm, 2)
If IsObj($oQuery) Then ; Это на случай, если уже авторизованы
    _IEFormElementSetValue($oQuery, $sPass)
    _IEFormElementSetValue(_IEFormElementGetCollection($oForm, 1), $sLogin)
    _IEFormSubmit($oForm)
  ;  _IENavigate($oIE, $sUrl)

sleep(3000)
 EndIf

;postim
 $oIE = _IECreate($sUrl, 1) ; Пытаться присоединиться к существующему окну

$oForm = _IEFormGetObjByName($oIE, 'quick_reply')
If Not IsObj($oForm) Then Exit MsgBox(4096+16, 'Ошибка!', 'Форма для быстрого ответа не обнаружено.' &@CRLF& 'Зарегистрируйтесь и повторите попытку.')
$oQuery = _IEFormElementGetObjByName($oForm, 'message')
_IEFormElementSetValue($oQuery, ClipGet())
_IEFormSubmit($oForm)
ClipPut('')
(@error) ? MsgBox(4096+16, 'Ошибка!', 'Не удалось отправить форму.') : MsgBox(4096+64, 'Отчет:', 'Форма отправлена.')
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Anna [?]
Подскажите, пожалуйста, как сделать, чтобы авторизация и последующие действия производились в одном окне.
Не пользоваться _IECreate 2 раза. Даже если там второй параметр 1. В справке написано что 1 - это попытаться присоединиться к окну. Он попытался но не смог и открыл второе. Странная функция да...
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
inververs сказал(а):
Anna [?]
Подскажите, пожалуйста, как сделать, чтобы авторизация и последующие действия производились в одном окне.
Не пользоваться _IECreate 2 раза. Даже если там второй параметр 1. В справке написано что 1 - это попытаться присоединиться к окну. Он попытался но не смог и открыл второе. Странная функция да...
Удалила повтор _IECreate.
В таком виде ошибка: “форма для быстрого ответа не обнаружена”

Увеличила, паузу после авторизации, останавливается на странице (прикрепила снимок)
хотя раньше, продолжалось выполнение алгоритма.
 

Вложения

  • error_.JPG
    error_.JPG
    22.2 КБ · Просмотры: 10
A

Alofa

Гость
Код:
#include <IE.au3>
HotKeySet('{Esc}', '_Exit')

Global $vKeyURL[2][3] = [["Любовь", 'http://ruforum.mt5.com/threads/3101-a-kto-nibud-pishet-stihi', ''], _
		["Здание", 'http://ruforum.mt5.com/threads/56867-prodayu-to-ne-znayu-chto', '']]
Global $sClip, $sLogin = 'Anna', $sPass = '333444'

While 1
	$sClip = ClipGet()
	If StringInStr($sClip, "а") Then
		If Not _test_func() Then MsgBox(4096 + 16, 'Ошибка!', 'Ошибка функции _test_func() = ' & @error)
		ClipPut('')
	EndIf
	Sleep(500)
WEnd

Func _test_func()
	Local $oIE, $oForm, $oQuery
	Select
		Case StringInStr($sClip, $vKeyURL[0][0])
			If Not WinActivate(_IEPropertyGet($vKeyURL[0][2], "hwnd")) Then $vKeyURL[0][2] = start_autorisation($vKeyURL[0][1])
			$oIE = $vKeyURL[0][2]
		Case StringInStr($sClip, $vKeyURL[1][0])
			If Not WinActivate(_IEPropertyGet($vKeyURL[1][2], "hwnd")) Then $vKeyURL[1][2] = start_autorisation($vKeyURL[1][1])
			$oIE = $vKeyURL[1][2]
		Case Else
			Return 1
	EndSelect
	If Not IsObj($oIE) Then Return SetError(4, 0, 0)

	$oForm = _IEFormGetObjByName($oIE, 'quick_reply')
	If Not IsObj($oForm) Then Return SetError(5, 0, 0)
	$oQuery = _IEFormElementGetObjByName($oForm, 'message')
	_IEFormElementSetValue($oQuery, $sClip)
	If Not _IEFormSubmit($oForm) Then Return SetError(6, 0, 0)
	Return 1
EndFunc   ;==>_test_func

Func start_autorisation($sUrl)
	Local $oIE, $oForm, $oQuery
	$oIE = _IECreate($sUrl)
	If @error Then Return SetError(2, 0, 0)
	$oForm = _IEFormGetCollection($oIE, 0)
	$oQuery = _IEFormElementGetCollection($oForm, 2)
	If IsObj($oQuery) Then ; Это на случай, если уже авторизованы
		_IEFormElementSetValue($oQuery, $sPass)
		$oQuery = _IEFormElementGetCollection($oForm, 1)
		_IEFormElementSetValue($oQuery, $sLogin)
		If @error Then Return SetError(3, 0, 0)
		_IEFormSubmit($oForm)
	EndIf
	_IENavigate($oIE, $sUrl)
	Return $oIE
EndFunc   ;==>start_autorisation

Func _Exit()
	Exit
EndFunc   ;==>_Exit


Anna у вас появятся вопросы. Но перед тем как их задавать просмотрите каждую строчку кода со справкой.
Это далеко не эталон, это всего лишь мой вариант. ;)


Добавлено: Июнь 08, 2016
Подправил кое-чаво - добавил одну функцию.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Авторизация в 3 строчки:
Код:
$oIe.document.querySelector('#navbar_username').value = 'Anna'
$oIe.document.querySelector('#navbar_password').value = '1234'
$oIe.document.querySelector('.loginbutton').click()
_IELoadWait($oIe, 1000)



Добавлено:
Сообщение автоматически объединено:

Или так (что бы не писать все время $oIe.document)
Код:
With $oIe.document
	.querySelector('#navbar_username').value = 'Anna'
	.querySelector('#navbar_password').value = '1234'
	.querySelector('.loginbutton').click()
EndWith

_IELoadWait($oIe, 1000)
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Уважаемые господа, спасибо за помощь, которую Вы оказываете, тратя своё время.
- Господин Alofa, даже при помощи справки я не смогу найти причину ошибки возникающей в процессе выполнения предоставленного вами скрипта.
Код ошибки 5. Подскажите что сделать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Anna
Раскомментируйте последнюю строчку для отправки сообщения
Код:
#include <UIAutomate.au3> ; http://autoit-script.ru/index.php/topic,16780.0.html

Global $sName = "Трейдерша", $sPass = "1q2w3e4" ; реальная тестовая регистрация

If StringInStr(ClipGet(), "Любовь") Then
  $sUrl = 'http://ruforum.mt5.com/threads/3101-a-kto-nibud-pishet-stihi'
ElseIf StringInStr(ClipGet(), "Здание") Then
  $sUrl = 'http://ruforum.mt5.com/threads/56867-prodayu-to-ne-znayu-chto'
Else
  Exit MsgBox(0, @ScriptName, "Искомые слова в БО не найдены")
EndIf

Run(@ProgramFilesDir & "\Internet Explorer\iexplore.exe http://ruforum.mt5.com")

$hWnd = WinWaitActive("[class:IEFrame]", "", 5)
$oParent = _UIA_GetElementFromHandle($hWnd)
For $i = 0 To 2
  $oName = _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "navbar_username", "AutomationId", False, 1)
  If Not @error Then ExitLoop
  $oWelc = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Добро пожаловать", Default, True, 1)
  If Not @error Then ExitLoop
Next
If IsObj($oName) Then
  _UIA_ElementTextSetValue($oName, $sName)
  $oPass = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "navbar_password", "AutomationId")
  _UIA_ElementTextSetValue($oPass, $sPass)
  $oBtn = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Вход")
  _UIA_ElementDoDefaultAction($oBtn)
  $oNext = _UIA_WaitControlTypeElement($oParent, "UIA_HyperlinkControlTypeId", "если ваш обозреватель не поддерживает", Default, True)
  If Not @error Then _UIA_ElementDoDefaultAction($oNext)
  _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Добро пожаловать", Default, True)
EndIf

ControlSetText($hWnd, "", "Edit1", $sUrl)
ControlSend($hWnd, "", "Edit1", "{enter}")

$oQuick = _UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Отправить быстрый ответ")
$oEdit = _UIA_WaitControlTypeElement($oParent, "UIA_PaneControlTypeId", $sUrl)
$aPanels = _UIA_FindAllElements($oParent, "Name", $sUrl)
If Not @error Then _UIA_ElementSetFocus($aPanels[$aPanels[0]])
Send("+{ins}")
;~ _UIA_ElementDoDefaultAction($oQuick)



Добавлено:
Сообщение автоматически объединено:

Alofa
После перенаправления почти всегда пересоздаётся вкладка и всё содержимое, поэтому объект нужно создавать заново
Код:
...
    EndSelect
    Sleep(10000) ; перенаправление и загрузка страницы
    $hCtrl = ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1")
    $oIE = __IEControlGetObjFromHWND($hCtrl)
    If Not IsObj($oIE) Then Return SetError(4, 0, 0)
...
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Спасибо.
Уважаемый, InnI, у меня предоставленный вами скрипт, совершает только переходы, не пытаясь авторизоваться. Ошибок не выдаёт. Операционная система Windows XP.

В первом посте, этой темы опубликован скрипт который делает всё, что мне нужно, хочу лишь, чтобы всё это делалось в одном окне. Помогите.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Anna
Операционная система Windows XP.
Предупреждать надо.

Попробуйте заменить строку
Код:
$oIE = _IECreate($sUrl, 1) ; Пытаться присоединиться к существующему окну
на
Код:
$hCtrl = ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1")
  $oIE = __IEControlGetObjFromHWND($hCtrl)
И увеличьте предыдущий Sleep(3000) секунд до десяти.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
И увеличьте предыдущий Sleep(3000) секунд до десяти.
Первый раз, отрабатывает нормально, при копировании текста со вторым ключевым словом, останавливается на странице, снимок прикрепила. Безнадёжно?
 

Вложения

  • error_1.JPG
    error_1.JPG
    32.1 КБ · Просмотры: 10

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
#include <IE.au3>

Global $sLogin = 'Трейдерша', $sPass = '1q2w3e4'

;select url
If StringInStr(ClipGet(), "Любовь") Then
  $sUrl = 'http://ruforum.mt5.com/threads/3101-a-kto-nibud-pishet-stihi'
ElseIf StringInStr(ClipGet(), "Здание") Then
  $sUrl = 'http://ruforum.mt5.com/threads/56867-prodayu-to-ne-znayu-chto'
Else
  Exit MsgBox(0, @ScriptName, "Искомые слова в БО не найдены")
EndIf

;start_autorisation
$oIE = _IECreate($sUrl)
$oLogin = _IEGetObjById($oIE, 'navbar_username')
If IsObj($oLogin) Then
  $oPass = _IEGetObjById($oIE, 'navbar_password')
  _IEFormElementSetValue($oLogin, $sLogin)
  _IEFormElementSetValue($oPass, $sPass)
  $oForm = _IEFormGetCollection($oIE, 0)
  _IEFormSubmit($oForm)
  _IELoadWait($oIE)
  For $i = 0 To 9
    If ControlGetText("[class:IEFrame]", "", "Edit1") = $sUrl Then ExitLoop
    Sleep(1000)
  Next
  $hCtrl = ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1")
  $oIE = __IEControlGetObjFromHWND($hCtrl)
  _IELoadWait($oIE)
EndIf

;postim
$oForm = _IEFormGetObjByName($oIE, 'quick_reply')
If Not IsObj($oForm) Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Форма для быстрого ответа не обнаружена.' & @CRLF & 'Зарегистрируйтесь и повторите попытку.')
$oQuery = _IEFormElementGetObjByName($oForm, 'message')
_IEFormElementSetValue($oQuery, ClipGet())
_IEFormSubmit($oForm)
$Var = (@error) ? MsgBox(4096 + 16, 'Ошибка!', 'Не удалось отправить форму.') : MsgBox(4096 + 64, 'Отчет:', 'Форма отправлена.')
ClipPut('')
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2

Спасибо, в таком виде работает стабильно, но, увы, каждое сообщение публикуется в новом окне.
Вы исключили из исходного кода цикл, а он нужен.
Зациклено, по условию:-“в буфере есть буква а,-- вызов функции”.
Постоянно мониторить буфер, и если в нём нет ключевых слов, не завершать работу, продолжать ждать их появления.


Если не получается всё делать в одном окне, быть может есть способ, после очистки буфера, закрывать все окна IE, кроме окна созданного последним.
Код:
#include <IE.au3>

Global $sLogin = 'Трейдерша', $sPass = '1q2w3e4'

While 1
$flag_0 = StringInStr(ClipGet(), "а") ? 1 : 0
 If  $flag_0 Then _test_func()
sleep(5*1000)
WEnd

Func _test_func()
;select url
If StringInStr(ClipGet(), "Любовь") Then
  $sUrl = 'http://ruforum.mt5.com/threads/3101-a-kto-nibud-pishet-stihi'
ElseIf StringInStr(ClipGet(), "Здание") Then
  $sUrl = 'http://ruforum.mt5.com/threads/56867-prodayu-to-ne-znayu-chto'
Else
  Exit MsgBox(0, @ScriptName, "Искомые слова в БО не найдены")
EndIf

;start_autorisation
$oIE = _IECreate($sUrl)
$oLogin = _IEGetObjById($oIE, 'navbar_username')
If IsObj($oLogin) Then
  $oPass = _IEGetObjById($oIE, 'navbar_password')
  _IEFormElementSetValue($oLogin, $sLogin)
  _IEFormElementSetValue($oPass, $sPass)
  $oForm = _IEFormGetCollection($oIE, 0)
  _IEFormSubmit($oForm)
  _IELoadWait($oIE)
  For $i = 0 To 9
    If ControlGetText("[class:IEFrame]", "", "Edit1") = $sUrl Then ExitLoop
    Sleep(1000)
  Next
  $hCtrl = ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1")
  $oIE = __IEControlGetObjFromHWND($hCtrl)
  _IELoadWait($oIE)
EndIf

;postim
$oForm = _IEFormGetObjByName($oIE, 'quick_reply')
If Not IsObj($oForm) Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Форма для быстрого ответа не обнаружена.' & @CRLF & 'Зарегистрируйтесь и повторите попытку.')
$oQuery = _IEFormElementGetObjByName($oForm, 'message')
_IEFormElementSetValue($oQuery, ClipGet())
_IEFormSubmit($oForm)
$Var = (@error) ? MsgBox(4096 + 16, 'Ошибка!', 'Не удалось отправить форму.') : MsgBox(4096 + 64, 'Отчет:', 'Форма отправлена.')
ClipPut('')
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Anna
В описание глобальных переменных добавьте $oIE и замените строку
Код:
$oIE = _IECreate($sUrl)
на условие
Код:
If IsObj($oIE) Then
  _IENavigate($oIE, $sUrl)
Else
  $oIE = _IECreate($sUrl)
EndIf
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
В описание глобальных переменных добавьте $oIE и замените строку
Ура, Autoit! Да здравствует, InnI!
Цель достигнута.
Спасибо, всем кто принимал участие.
Узнала много нового, интересного.
 
Верх