Показать полную графическую версию : The requested action with this object has failed.:
прога:
берет и экселя значение ссылки , переходит по ней, кликает кнопку "показать номер", копирует значение ссылки, вставляет в ексель, копирует поле с класом person-name , вставляет в ексель.
все просто, но !
#include <IE.au3>
$oExcel = ObjCreate('Excel.Application')
$oExcel.Visible = True
$oExcel.WorkBooks.Open(@ScriptDir & '\links.xlsx')
While 1
If WinExists("Internet Explorer") Then
WinActivate("Internet Explorer")
ControlClick("Internet Explorer", "Закрыть программу", "Button2")
EndIf
For $i = 55 to 1000 Step 1
ConsoleWrite ( $oExcel.Activesheet.Cells($i, 1).Value )
$link = $oExcel.Activesheet.Cells($i, 1).Value
Sleep(500)
$sUrl=$link
$oIE=_IECreate($sUrl,0,0,1,0)
Sleep(2000)
$oLinks=_IETagNameGetCollection($oIE, 'a')
For $oTextArea In $oLinks
If StringInStr(_IEPropertyGet($oTextArea, 'outerhtml'), 'Показать номер') Then
_IEAction($oTextArea, 'click')
Sleep(4000)
$Var=$oTextArea.href
$oExcel.Activesheet.Cells($i,2).Value=$Var
ExitLoop
EndIf
Next
$tags = $oIE.document.GetElementsByTagName("div")
Sleep(2000)
For $tag in $tags
$class_value = $tag.className
If $class_value = "person-name" Then
Sleep(2000)
$oExcel.Activesheet.Cells($i,3).Value=_IEPropertyGet($tag, 'innertext')
ExitLoop
EndIf
Next
_IEQuit($oIE)
Next
Wend
иногда выпадает ошибка
The requested action with this object has failed.:
$tags = $oIE.document.GetElementsByTagName("div")
$tags = $oIE.document^ ERROR
>Exit code: 1 Time: 180.9
и не понятна причина. уже голову сломал :(
интересно посмотреть, а links.xlsx файла нет для примера?
Попробуйте этот вариант, поставил разные проверки..
А конкретно Ваша ошибка
$tags = $oIE.document.GetElementsByTagName("div")
$tags = $oIE.document^ ERROR
из-за того что oIE.document не был открыт или с ошибкой ( нет страницы например)
можно еще проверять $oIE на то, что он - объект...
#include <IE.au3>
Local $oExcel = ObjGet("", "Excel.Application")
If not IsObj($oExcel) Then
$oExcel = ObjCreate('Excel.Application')
EndIf
Sleep(2000)
If IsObj($oExcel) Then
$oExcel.Visible = True
$oExcel.WorkBooks.Open(@ScriptDir & '\links.xlsx')
Sleep(1000)
For $i = 1 to 15 Step 1
If not IsObj($oExcel) Then
ConsoleWrite ('Excel not found')
ExitLoop
EndIf
ConsoleWrite ( $i & ' ' & $oExcel.Activesheet.Cells($i, 1).Value & @LF)
$link = $oExcel.Activesheet.Cells($i, 1).Value
$sUrl=$link
$oIE=_IECreate($sUrl,0,0,1,1)
$oLinks=_IETagNameGetCollection($oIE, 'a')
For $oTextArea In $oLinks
If StringInStr(_IEPropertyGet($oTextArea, 'outerhtml'), 'Показать номер') Then
_IEAction($oTextArea, 'click')
Sleep(500)
$Var=$oTextArea.href
$oExcel.Activesheet.Cells($i,2).Value=$Var
ExitLoop
EndIf
Next
$tags = $oIE.document.GetElementsByTagName("div")
;Sleep(2000)
if IsObj($tags) Then
For $tag in $tags
$class_value = $tag.className
If $class_value = "person-name" Then
;Sleep(2000)
$oExcel.Activesheet.Cells($i,3).Value=_IEPropertyGet($tag, 'innertext')
ExitLoop
EndIf
Next
EndIf
_IEQuit($oIE)
Next
Else
ConsoleWrite ("Excel is running." & @LF)
EndIf
ConsoleWrite ("Exit au3." & @LF)
спасибо.
но теперь это :
The requested action with this object has failed.:
$tags = $oIE.document.GetElementsByTagName("div")
$tags = $oIE.document^ ERROR
вот вам файл мой(большой). чуть подольше выполняется и падает.
может можно какую-то проверку добавить перед
$oIE.document.GetElementsByTagName("div")
?
добавил if IsObj($oIE) Then ... не помогло :(
Вот попробуй такой вариант.
до 100 пробовал, норм.
#include <IE.au3>
_IEErrorNotify(False)
Local $oExcel = ObjGet("", "Excel.Application")
If not IsObj($oExcel) Then
$oExcel = ObjCreate('Excel.Application')
EndIf
Sleep(2000)
If IsObj($oExcel) Then
$oExcel.Visible = True
$oExcel.WorkBooks.Open(@ScriptDir & '\links.xlsx')
Sleep(2000)
For $i = 1 to 15 Step 1
If not IsObj($oExcel) Then
ConsoleWrite ('Excel not found')
ExitLoop
EndIf
ConsoleWrite ( $i & ' ' & $oExcel.Activesheet.Cells($i, 1).Value & @LF)
Local $boolIsRealPage = False
$link = $oExcel.Activesheet.Cells($i, 1).Value
$sUrl=$link
$oIE=_IECreate($sUrl,1,0,1,0)
;Sleep(200)
$oLinks=_IETagNameGetCollection($oIE, 'a')
if IsObj($oLinks) Then
;ConsoleWrite ('links=' & $oLinks.Length & @LF)
;Sleep(200)
For $oTextArea In $oLinks
If StringInStr(_IEPropertyGet($oTextArea, 'outerhtml'), 'Показать номер') Then
_IEAction($oTextArea, 'click')
Sleep(500)
$Var=$oTextArea.href
$oExcel.Activesheet.Cells($i,2).Value=$Var
$boolIsRealPage = True
ExitLoop
EndIf
Next
Else
ConsoleWrite ('links no obj' & @LF)
EndIf
if $boolIsRealPage Then
$tags = $oIE.document.GetElementsByTagName("div")
if IsObj($tags) Then
;ConsoleWrite ('tags=' & $tags.Length & @LF)
;Sleep(200)
For $tag in $tags
$class_value = $tag.className
If $class_value = "person-name" Then
$oExcel.Activesheet.Cells($i,3).Value=_IEPropertyGet($tag, 'innertext')
ExitLoop
EndIf
Next
Else
ConsoleWrite ('tags no obj' & @LF)
EndIf
Else
ConsoleWrite ('Bad page - no tel.' & @LF)
EndIf
_IEQuit($oIE)
Next
Else
ConsoleWrite ("Excel is running." & @LF)
EndIf
ConsoleWrite ("Exit au3." & @LF)
The requested action with this object has failed.:
ConsoleWrite ( $i & ' ' & $oExcel.Activesheet.Cells($i, 1).Value & @LF)
ConsoleWrite ( $i & ' ' & $oExcel.Activesheet^ ERROR
если убрать ConsoleWrite ( $i & ' ' & $oExcel.Activesheet.Cells($i, 1).Value & @LF)
, то ошибка дальше в $link = $oExcel.Activesheet.Cells($i, 1).Value
что-то все же с $oExcel.Activesheet.Cells($i, 1).Value. может переполняется какая-то память ? какую бы проверку пихнуть туда.ю чтобы в случае ошибки там, он просто проходил дальше. :unsure:
что-то все же с $oExcel.Activesheet.Cells($i, 1).Value. может переполняется какая-то память ? у меня подобные ошибки были только когда я во время выполнения скрипта закрываю excel ручками.
Соответственно можно поставить дополнительно перед записью в ячейку проверку If not IsObj($oExcel) Then ...
Вообще перед запуском скрипта нужно проверить чтобы процессы excel.exe и iexplore.exe были закрыты, снять их в диспетчере задач. Тогда ошибок не должно быть никаких.
PS:
еще в начале главного цикла все таки нужен таймаут )) , сайт может блокирнуть временно по IP если слишком часто идут запросы:
For $i = 1 to 100 Step 1
Sleep(1000)
Окончательный вариант скрипта:
#include <IE.au3>
Local $oIE, $oLinks, $tags, $boolIsRealPage
_IEErrorNotify(False)
;Удаление кэша IE
RunWait(@SystemDir & '\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8', '', @SW_HIDE)
; Открываем IE
My_New_IE()
;Создаем Excel
Local $oExcel = ObjGet("", "Excel.Application")
If not IsObj($oExcel) Then
$oExcel = ObjCreate('Excel.Application')
EndIf
If IsObj($oExcel) Then
$oExcel.Visible = True
$oExcel.WorkBooks.Open(@ScriptDir & '\links.xlsx')
For $i = 1 to 250 Step 1
Sleep(1000)
If not IsObj($oExcel) Then
ConsoleWrite ('Excel not found')
ExitLoop
EndIf
$boolIsRealPage = False
$link = $oExcel.Activesheet.Cells($i, 1).Value
ConsoleWrite ( $i & ' ' & $link & @LF)
_IENavigate($oIE, $link, 0) ; тут не ждем пока загрузится
_IELoadWait($oIE, 5000 , 15000) ; а тут ждем максимум 15 сек
if @error Then ; 2 попытка
ConsoleWrite ('2 try' & @LF)
My_New_IE()
_IENavigate($oIE, $link, 0) ; тут не ждем пока загрузится
_IELoadWait($oIE, 5000 , 15000) ; а тут ждем максимум 15 сек
EndIf
if not @error Then
ConsoleWrite (' open url ')
$oLinks=_IETagNameGetCollection($oIE, 'a')
ConsoleWrite (', get collecion a ' & @LF)
if IsObj($oLinks) Then
ConsoleWrite (' links=' & $oLinks.Length & ' ')
Sleep(200)
For $oTextArea In $oLinks
If StringInStr(_IEPropertyGet($oTextArea, 'outerhtml'), 'Показать номер') Then
_IEAction($oTextArea, 'click')
Sleep(500)
$oExcel.Activesheet.Cells($i,2).Value=$oTextArea.href
$boolIsRealPage = True
ExitLoop
EndIf
Next
Else
ConsoleWrite ('links no obj' & @LF)
EndIf
if $boolIsRealPage Then
$tags = $oIE.document.GetElementsByTagName("div")
if IsObj($tags) Then
ConsoleWrite ('tags=' & $tags.Length & @LF)
Sleep(200)
For $tag in $tags
$class_value = $tag.className
If $class_value = "person-name" Then
$oExcel.Activesheet.Cells($i,3).Value=_IEPropertyGet($tag, 'innertext')
ExitLoop
EndIf
Next
Else
ConsoleWrite ('tags no obj' & @LF)
EndIf
Else
ConsoleWrite ('Bad page - no tel.' & @LF)
EndIf
Else
; в случае ошибки IE - переоткрываем
ConsoleWrite ('New IE content' & @LF)
My_New_IE()
EndIf
Next
Else
ConsoleWrite ("Excel is running." & @LF)
EndIf
_IEQuit($oIE)
ConsoleWrite ("Exit au3." & @LF)
;----------------------------------------
Func My_New_IE()
If IsObj($oIE) Then
_IEQuit($oIE)
EndIf
$oIE=_IECreate("about:blank",1,0,1)
EndFunc
Убрал постоянное открытие закрытие IE, заменил на открытие ссылки в том же окне, добавил переоткрытие в случае ошибки/зависона.
Таймауты можно наверное переделать, но это уже не суть.
ЗЫ: Вообще IE неуклюжий монстр..
нды. видимо проблему у меня.
The requested action with this object has failed.:
$tags = $oIE.document.GetElementsByTagName("div")
$tags = $oIE.document^ ERROR
а какая у вас ОС на компьютере и какой Internet Explorer можно поинтересоваться ? :(
Win 10 (10576) 32x, IE 11
у Вас ошибки все связаны с отсутствием объекта, в данном случае $oIE, может он слетает? Могу посоветовать одновременно с выполнением скрипта просмотреть в диспетчере задач поведение IE.
да. Нужно разобраться с поведением IE.
Спасибо за вашу помощь :up , доберусь до этой проблемы после выходных. Сюда отпишусь.
Все работает... правда у меня тоже стоит вин 10 32х, но все работает )
Думаю проблема была в разрядности IE. он похоже путался когда какой запускать.
спасибо за помощь!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.