Нет, вот что происходит, когда решение работает не везде одинаково, но новичок - он же новичок, ему необязательно верить.Yashied сказал(а):InnI, вот что происходит, когда пытаешься дать человеку такое решение, до понимания которого, ему как до Луны. Тема растянулась уже на 40 постов. Толи еще будет.
Что за обидки? Здесь дело не в вере, а в том, что профессионал, в данном случае InnI, зачастую сразу может сказать кто и где виноват, и на чьей стороне возникают те или иные проблемы. Поверьте, это так в любой сфере деятельности.bescom сказал(а):...но новичок - он же новичок, ему необязательно верить.
Я с этим даже и не спорю, но не забывайте, что мы находимся на тематическом форуме посвященному AutoIt, а не тем сферам, где вы хорошо разбираетесь.bescom сказал(а):Кстати, наверняка Вы разбираетесь во многих сферах хуже меня, но я не пытаюсь каким-то образом сказать, что Вам до моих знаний, как до Луны.
Я очень хочу помочь (по-своему ), но пока воздержусь.bescom сказал(а):И если не хотите помочь, то очень прошу, хотя бы не мешайте.
Меня больше волнует не решение, а возможность впоследствии найти это самое решение, читай тему. На данный момент ситуация такая, что посты даже двухлетней давности найти на форуме становится проблемой. Ну а самое смешное, что если у кого-то и возникнет похожая задачка, то в 99% случаев он не станет вкуривать все эти 40 несвязанных постов (факт). Кстати, отсюда и возникает постоянное дублирование тем.bescom сказал(а):От того, что удастся найти решение, выиграют и те, кто впоследствии будет читать тему.
Меня терзают смутные сомнения... А на машину с ХР вы предварительно API UIAutomation установили? Утилита Inspect на машине с ХР запускается?на машине с XP
Да, установил. Да, Inspect запускается.на машину с ХР вы предварительно API UIAutomation установили? Утилита Inspect на машине с ХР запускается?
Вот репорт из отладчика:Запускайте скрипт прямо из SciTE
>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\111\hod_0.01\hod_0.01-8.au3"
_FFConnect: OS: WIN_XP WIN32_NT 2600 Service Pack 3
_FFConnect: AutoIt: 3.3.12.0
_FFConnect: FF.au3: 0.6.0.1b-10
_FFConnect: IP: 127.0.0.1
_FFConnect: Port: 4242
_FFConnect: Delay: 2ms
_FFConnect: Socket: 1368
_FFConnect: Browser: Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0
__FFSendJavaScripts: Sending functions to FireFox .......... done
_FFOpenURL: http://bescomblog.com/?page_id=4089
__FFSend: try{window.content.top.document.location.href='http://bescomblog.com/?page_id=4089'}catch(e){'_FFCmd_Err';};
__FFRecv: http://bescomblog.com/?page_id=4089
_FFLoadWait: .................................................................. loaded in 23333ms
[object HTMLDocument] - {location: {...}, sm2movie: function() {...}, searchform: {...}, tpix_179357: {...}, location: {...}, getElementsByName: function() {...}, getItems: function() {...}, ...}
__FFSend: FFau3.WCD=window.content.top.document;
__FFRecv: [object HTMLDocument] - {location: {...}, sm2movie: function() {...}, searchform: {...}, tpix_179357: {...}, location: {...}, getElementsByName: function() {...}, getItems: function() {...}, ...}
[object HTMLDocument] - {location: {...}, sm2movie: function() {...}, searchform: {...}, tpix_179357: {...}, location: {...}, getElementsByName: function() {...}, getItems: function() {...}, ...}
__FFSend: repl.quit()
_FFDisConnect: disconnected
_FFConnect: OS: WIN_XP WIN32_NT 2600 Service Pack 3
_FFConnect: AutoIt: 3.3.12.0
_FFConnect: FF.au3: 0.6.0.1b-10
_FFConnect: IP: 127.0.0.1
_FFConnect: Port: 4242
_FFConnect: Delay: 2ms
_FFConnect: Socket: 1368
_FFConnect: Browser: Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0
__FFSendJavaScripts: Sending functions to FireFox .......... done
__FFSend: try{window.content.top.document.location.href}catch(e){'_FFCmd_Err';};
__FFRecv: http://bescomblog.com/?page_id=4089
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
>Exit code: 0 Time: 210.9
If Not IsArray($aAll) Then
If $log = 1 Then
FileWriteLine(@ScriptDir&"\log.txt", "URL для клика не найден - "&$urlstr1) ; Пишем в файл URL, который не найден
_FFLinkClick($urlstr1)
_FFLoadWait()
EndIf
Sleep(30)
ExitLoop
EndIf
Так что же вы ей не пользуетесь?Все ходит, как надо.
UDF работает корректно - она правильно выводит сообщения об ошибках. А вот почему методы объекта UIAutomation так работают - это вопрос или к Microsoft или к разработчикам Firefox.библиотека в каких-то условиях работает некорректно
#include "UIAutomate.au3"
Opt("WinTitleMatchMode", 2)
Global $aFind[] = ["http://bescomblog.com/?page_id=4089&replytocom=3824#respond", _
"http://bescomblog.com/?page_id=4089&cpage=1#comment-3742", _
"http://bescomblog.com/?p=4133"]
LogErr("-----------------------------", 0)
$hWnd = WinActivate("Mozilla Firefox")
If Not $hWnd Then LogErr("Окно Firefox не найдено", 1)
$oParent = _UIA_GetElementFromHandle($hWnd)
LogErr("_UIA_GetElementFromHandle : " & @error)
If Not IsObj($oParent) Then LogErr("Ошибка создания объекта по идентификатору окна", 1)
SearchObj($UIA_HyperlinkControlTypeId)
SearchObj($UIA_EditControlTypeId)
ShellExecute("LogErr.txt")
; --------------------------
Func LogErr($str, $exit = 0)
FileWriteLine("LogErr.txt", $str)
If $exit Then
ShellExecute("LogErr.txt")
Exit
EndIf
EndFunc
Func SearchObj($iTypeID)
LogErr(">>> Поиск : " & $iTypeID)
$aObj = _UIA_FindAllElements($oParent, "ControlType", $iTypeID)
LogErr("_UIA_FindAllElements : " & @error)
If Not IsArray($aObj) Or Not $aObj[0] Then
LogErr("Объекты не найдены на странице")
Return
EndIf
LogErr("Всего найдено объектов : " & $aObj[0])
For $i = 0 To UBound($aFind) - 1
LogErr("--- $i = " & $i)
$aAll = _UIA_FindElementsInArray($aObj, "Value.Value", $aFind[$i], True)
LogErr("_UIA_FindElementsInArray : " & @error)
If Not IsArray($aAll) Or Not $aAll[0] Then
LogErr("Не найдено содержимое : " & $aFind[$i])
Else
LogErr("Найдено объектов : " & $aAll[0])
For $j = 1 To $aAll[0]
LogErr($j & ": Name : " & _UIA_ElementGetPropertyValue($aAll[$j], "Name"))
LogErr($j & ": Value.Value : " & _UIA_ElementGetPropertyValue($aAll[$j], "Value.Value"))
Next
EndIf
Next
EndFunc
1 - Мне нужна полная имитация клика мышью, 2 - скрипт, реализованный на Вашей библиотеке, кликает и по ссылкам, и по изображениям, причем можно делать рандомное "плавание" координат клика, а другие решения таких возможностей не дают.что же вы ей не пользуетесь?
Вот видите, все-таки зря меня тут во враги записали. Начинаете верить, что ситуация может иметь место. Я Вам в любом случае бесконечно благодарен за помощь.вопрос или к Microsoft или к разработчикам Firefox
#include "UIAutomate.au3"
Opt("WinTitleMatchMode", 2)
Global $pParent, $pCondLink, $pCondValue, $pCondAND, $pUIElementArray, $iElements
LogErr("-----------------------------", 0)
$hWnd = WinActivate("Mozilla Firefox")
If Not $hWnd Then LogErr("Окно Firefox не найдено", 1)
$oUIAutomation = ObjCreateInterface($sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation)
If Not IsObj($oUIAutomation) Then LogErr("Ошибка создания объекта UIAutomation", 1)
$ErrCode = $oUIAutomation.ElementFromHandle($hWnd, $pParent)
LogErr("ElementFromHandle ErrCode " & Hex($ErrCode))
$oParent = ObjCreateInterface($pParent, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oParent) Then LogErr("Ошибка создания объекта по идентификатору окна", 1)
$ErrCode = $oUIAutomation.CreatePropertyCondition($UIA_ControlTypePropertyId, $UIA_HyperlinkControlTypeId, $pCondLink)
LogErr("CreatePropertyCondition (Link) ErrCode " & Hex($ErrCode))
If Not $pCondLink Then LogErr("Ошибка создания условия поиска ссылки", 1)
$ErrCode = $oParent.FindAll($TreeScope_Descendants, $pCondLink, $pUIElementArray)
LogErr("FindAll (Link) ErrCode " & Hex($ErrCode))
$oUIElementArray = ObjCreateInterface($pUIElementArray, $sIID_IUIAutomationElementArray, $dtagIUIAutomationElementArray)
If Not IsObj($oUIElementArray) Then LogErr("Ошибка создания объекта массива (Link)", 1)
$oUIElementArray.Length($iElements)
LogErr("Найдено ссылок : " & $iElements)
$ErrCode = $oUIAutomation.CreatePropertyCondition($UIA_ValueValuePropertyId, "http://bescomblog.com/?p=4133", $pCondValue)
LogErr("CreatePropertyCondition (Value) ErrCode " & Hex($ErrCode))
If Not $pCondValue Then LogErr("Ошибка создания условия поиска содержимого", 1)
$ErrCode = $oParent.FindAll($TreeScope_Descendants, $pCondValue, $pUIElementArray)
LogErr("FindAll (Value) ErrCode " & Hex($ErrCode))
$oUIElementArray = ObjCreateInterface($pUIElementArray, $sIID_IUIAutomationElementArray, $dtagIUIAutomationElementArray)
If Not IsObj($oUIElementArray) Then LogErr("Ошибка создания объекта массива (Value)", 1)
$oUIElementArray.Length($iElements)
LogErr("Найдено содержимого : " & $iElements)
$ErrCode = $oUIAutomation.CreateAndCondition($pCondLink, $pCondValue, $pCondAND)
LogErr("CreateAndCondition ErrCode " & Hex($ErrCode))
If Not $pCondAND Then LogErr("Ошибка создания логического условия", 1)
$ErrCode = $oParent.FindAll($TreeScope_Descendants, $pCondAND, $pUIElementArray)
LogErr("FindAll (AND) ErrCode " & Hex($ErrCode))
$oUIElementArray = ObjCreateInterface($pUIElementArray, $sIID_IUIAutomationElementArray, $dtagIUIAutomationElementArray)
If Not IsObj($oUIElementArray) Then LogErr("Ошибка создания объекта массива (AND)", 1)
$oUIElementArray.Length($iElements)
LogErr("Найдено ссылок с содержимым : " & $iElements)
ShellExecute("LogErr.txt")
; --------------------------
Func LogErr($str, $exit = 0)
FileWriteLine("LogErr.txt", $str)
If $exit Then
ShellExecute("LogErr.txt")
Exit
EndIf
EndFunc
#include "UIAutomate.au3"
Opt("WinTitleMatchMode", 2)
Global $pParent, $pCondLink, $pCondValue, $pCondAND, $pCondTrue, $pUIElement, $pUIElementArray, $iElements
LogErr("-----------------------------", 0)
$hWnd = WinActivate("Mozilla Firefox")
If Not $hWnd Then LogErr("Окно Firefox не найдено", 1)
$oUIAutomation = ObjCreateInterface($sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation)
If Not IsObj($oUIAutomation) Then LogErr("Ошибка создания объекта UIAutomation", 1)
$ErrCode = $oUIAutomation.ElementFromHandle($hWnd, $pParent)
LogErr("ElementFromHandle ErrCode " & Hex($ErrCode))
$oParent = ObjCreateInterface($pParent, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oParent) Then LogErr("Ошибка создания объекта по идентификатору окна", 1)
$ErrCode = $oUIAutomation.CreatePropertyCondition($UIA_ControlTypePropertyId, $UIA_HyperlinkControlTypeId, $pCondLink)
LogErr("CreatePropertyCondition (Link) ErrCode " & Hex($ErrCode))
If Not $pCondLink Then LogErr("Ошибка создания условия поиска ссылки", 1)
$ErrCode = $oParent.FindFirst($TreeScope_Descendants, $pCondLink, $pUIElement)
LogErr("FindFirst (Link) ErrCode " & Hex($ErrCode))
$oUIElement = ObjCreateInterface($pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oUIElement) Then LogErr("Ошибка создания объекта (Link)", 1)
LogErr("Ссылка найдена !")
$ErrCode = $oUIAutomation.CreatePropertyCondition($UIA_ValueValuePropertyId, "http://bescomblog.com/?p=4133", $pCondValue)
LogErr("CreatePropertyCondition (Value) ErrCode " & Hex($ErrCode))
If Not $pCondValue Then LogErr("Ошибка создания условия поиска содержимого", 1)
$ErrCode = $oParent.FindFirst($TreeScope_Descendants, $pCondValue, $pUIElement)
LogErr("FindFirst (Value) ErrCode " & Hex($ErrCode))
$oUIElement = ObjCreateInterface($pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oUIElement) Then LogErr("Ошибка создания объекта (Value)", 1)
LogErr("Содержимое найдено !")
$ErrCode = $oUIAutomation.CreateAndCondition($pCondLink, $pCondValue, $pCondAND)
LogErr("CreateAndCondition ErrCode " & Hex($ErrCode))
If Not $pCondAND Then LogErr("Ошибка создания логического условия", 1)
$ErrCode = $oParent.FindFirst($TreeScope_Descendants, $pCondAND, $pUIElement)
LogErr("FindFirst (AND) ErrCode " & Hex($ErrCode))
$oUIElement = ObjCreateInterface($pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oUIElement) Then LogErr("Ошибка создания объекта (AND)", 1)
LogErr("Ссылка с содержимым найдена !")
$ErrCode = $oUIAutomation.CreateTrueCondition($pCondTrue)
LogErr("CreateTrueCondition ErrCode " & Hex($ErrCode))
If Not $pCondTrue Then LogErr("Ошибка создания условия True", 1)
$ErrCode = $oParent.FindAll($TreeScope_Descendants, $pCondTrue, $pUIElementArray)
LogErr("FindAll (True) ErrCode " & Hex($ErrCode))
$oUIElementArray = ObjCreateInterface($pUIElementArray, $sIID_IUIAutomationElementArray, $dtagIUIAutomationElementArray)
If Not IsObj($oUIElementArray) Then LogErr("Ошибка создания объекта массива (True)", 1)
$oUIElementArray.Length($iElements)
LogErr("Всего найдено элементов : " & $iElements)
ShellExecute("LogErr.txt")
; --------------------------
Func LogErr($str, $exit = 0)
FileWriteLine("LogErr.txt", $str)
If $exit Then
ShellExecute("LogErr.txt")
Exit
EndIf
EndFunc
Func GoTarget()
Opt("WinTitleMatchMode", 2)
Do
$oParent = _UIA_GetElementFromHandle(WinActivate("Mozilla Firefox"))
Sleep(30)
Until IsObj($oParent)
While 1
URLFromArray()
$urlstr1 = FileReadLine(@ScriptDir & "\ok_links.txt", 1)
$pCnd1 = _UIA_CreatePropertyCondition("ControlType", $UIA_HyperlinkControlTypeId)
$pCnd2 = _UIA_CreatePropertyCondition("Value.Value", $urlstr1)
$pCndA = _UIA_CreateLogicalCondition($pCnd1, "AND", $pCnd2)
Local $pUIElement
$oParent.FindFirst($TreeScope_Descendants, $pCndA, $pUIElement)
$oLink = ObjCreateInterface($pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oLink) Then
Sleep(30)
ContinueLoop
EndIf
_UIA_ElementSetFocus($oLink)
If Not _UIA_ElementGetPropertyValue($oLink, "IsOffscreen") Then
$aRect = _UIA_ElementGetBoundingRectangle($oLink)
$x = Random(50, 1000)
$y = Random(200, 700)
MouseMove($x, $y, Random(5, 30))
Sleep(200)
MouseClick("left", ($aRect[0] + ($aRect[2] - $aRect[0]) / 2) + Random(-10, 10, 1), ($aRect[1] + ($aRect[3] - $aRect[1]) / 2) + Random(-1, 1, 1))
_FFLoadWait()
Return
EndIf
WEnd
EndFunc
В общем, докладываюсь. Этот вариант работает исправно, но для сложных случаев не годится. Как оптимальный, я выбрал предыдущий вариант + если не срабатывает - дорабатывать с помощью _FFLinkClick. В принципе, на данный момент меня устраивает.Тогда такой вариант. Но он будет работать только в случае, если ссылка находится на текущей вкладке и её содержимое полностью совпадает с искомой строкой
Я это знаю. Поэтому и сделал изначально функции _UIA_FindElementsInArray() и _UIA_GetControlTypeElement(), позволяющие находить элементы по частичному совпадению значения свойства. Для вашего "клинического" случая можно сделать обход всего дерева элементов через _UIA_ElementGetPreviousNext() с предварительным поиском дочерних элементов. Но, во-первых, это будет медленно, а, во-вторых, с рекурсиями я "не дружу".для сложных случаев не годится