Нет, вот что происходит, когда решение работает не везде одинаково, но новичок - он же новичок, ему необязательно верить.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(), позволяющие находить элементы по частичному совпадению значения свойства. Для вашего "клинического"для сложных случаев не годится