Войти

Показать полную графическую версию : The requested action with this object has failed.:


garanov
03-11-2015, 21:21
прога:

берет и экселя значение ссылки , переходит по ней, кликает кнопку "показать номер", копирует значение ссылки, вставляет в ексель, копирует поле с класом 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

и не понятна причина. уже голову сломал :(

Mike909
03-11-2015, 22:29
интересно посмотреть, а links.xlsx файла нет для примера?

garanov
04-11-2015, 08:17
есть, вот

garanov
04-11-2015, 08:18
вот

garanov
04-11-2015, 08:18
ой, продублировал :(

Mike909
04-11-2015, 14:16
Попробуйте этот вариант, поставил разные проверки..
А конкретно Ваша ошибка

$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)

garanov
04-11-2015, 21:25
спасибо.
но теперь это :


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 ... не помогло :(

garanov
04-11-2015, 21:39
файл links побольше

Mike909
04-11-2015, 22:44
Вот попробуй такой вариант.
до 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)

garanov
05-11-2015, 08:05
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:

Mike909
05-11-2015, 10:15
что-то все же с $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)

Mike909
05-11-2015, 11:11
Окончательный вариант скрипта:



#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 неуклюжий монстр..

Mike909
05-11-2015, 13:05
подправил скрипт выше.

garanov
05-11-2015, 20:17
нды. видимо проблему у меня.
The requested action with this object has failed.:
$tags = $oIE.document.GetElementsByTagName("div")
$tags = $oIE.document^ ERROR
а какая у вас ОС на компьютере и какой Internet Explorer можно поинтересоваться ? :(

Mike909
05-11-2015, 20:29
Win 10 (10576) 32x, IE 11
у Вас ошибки все связаны с отсутствием объекта, в данном случае $oIE, может он слетает? Могу посоветовать одновременно с выполнением скрипта просмотреть в диспетчере задач поведение IE.

garanov
06-11-2015, 07:52
да. Нужно разобраться с поведением IE.
Спасибо за вашу помощь :up , доберусь до этой проблемы после выходных. Сюда отпишусь.

garanov
09-11-2015, 12:18
Все работает... правда у меня тоже стоит вин 10 32х, но все работает )
Думаю проблема была в разрядности IE. он похоже путался когда какой запускать.
спасибо за помощь!




© OSzone.net 2001-2012