Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   The requested action with this object has failed.: (http://forum.oszone.net/showthread.php?t=307510)

garanov 03-11-2015 21:21 2571250

The requested action with this object has failed.:
 
прога:

берет и экселя значение ссылки , переходит по ней, кликает кнопку "показать номер", копирует значение ссылки, вставляет в ексель, копирует поле с класом person-name , вставляет в ексель.
все просто, но !


PHP код:

#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($i1).Value )
$link $oExcel.Activesheet.Cells($i1).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 2571287

интересно посмотреть, а links.xlsx файла нет для примера?

garanov 04-11-2015 08:17 2571381

Вложений: 1
есть, вот

garanov 04-11-2015 08:18 2571382

Вложений: 1
вот

garanov 04-11-2015 08:18 2571383

ой, продублировал :(

Mike909 04-11-2015 14:16 2571510

Попробуйте этот вариант, поставил разные проверки..
А конкретно Ваша ошибка

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

спасибо.
но теперь это :

PHP код:

The requested action with this object has failed.:
$tags $oIE.document.GetElementsByTagName("div")
$tags $oIE.documentERROR 

вот вам файл мой(большой). чуть подольше выполняется и падает.
может можно какую-то проверку добавить перед

$oIE.document.GetElementsByTagName("div")

?

добавил if IsObj($oIE) Then ... не помогло :(

garanov 04-11-2015 21:39 2571670

Вложений: 1
файл links побольше

Mike909 04-11-2015 22:44 2571700

Вот попробуй такой вариант.
до 100 пробовал, норм.
Скрытый текст

PHP код:

#include <IE.au3>

_IEErrorNotify(False)

Local $oExcel ObjGet("""Excel.Application")

If 
not IsObj($oExcelThen
      $oExcel 
ObjCreate('Excel.Application')
EndIf
Sleep(2000)

If 
IsObj($oExcelThen

$oExcel
.Visible True
$oExcel
.WorkBooks.Open(@ScriptDir '\links.xlsx')

Sleep(2000)
    
    For 
$i 1 to 15 Step 1
        
    
        
If not IsObj($oExcelThen
              ConsoleWrite 
('Excel not found')
              
ExitLoop
        
EndIf
        
        
ConsoleWrite $i ' ' $oExcel.Activesheet.Cells($i1).Value & @LF)
        
Local $boolIsRealPage False
        $link 
$oExcel.Activesheet.Cells($i1).Value        
        $sUrl
=$link        
        $oIE
=_IECreate($sUrl,1,0,1,0)
        ;
Sleep(200)        
        
$oLinks=_IETagNameGetCollection($oIE'a')    
            
        if 
IsObj($oLinksThen
            
;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($tagsThen
                
;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 2571753

PHP код:

The requested action with this object has failed.:
ConsoleWrite $i ' ' $oExcel.Activesheet.Cells($i1).Value & @LF)
ConsoleWrite $i ' ' $oExcel.ActivesheetERROR 


если убрать 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 2571784

Цитата:

что-то все же с $oExcel.Activesheet.Cells($i, 1).Value. может переполняется какая-то память ?
у меня подобные ошибки были только когда я во время выполнения скрипта закрываю excel ручками.
Соответственно можно поставить дополнительно перед записью в ячейку проверку If not IsObj($oExcel) Then ...

Вообще перед запуском скрипта нужно проверить чтобы процессы excel.exe и iexplore.exe были закрыты, снять их в диспетчере задач. Тогда ошибок не должно быть никаких.

PS:
еще в начале главного цикла все таки нужен таймаут )) , сайт может блокирнуть временно по IP если слишком часто идут запросы:
PHP код:

For $i 1 to 100 Step 1
    Sleep
(1000


Mike909 05-11-2015 11:11 2571811

Окончательный вариант скрипта:

Скрытый текст
PHP код:

#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($oExcelThen
      $oExcel 
ObjCreate('Excel.Application')
EndIf

If 
IsObj($oExcelThen

$oExcel
.Visible True
$oExcel
.WorkBooks.Open(@ScriptDir '\links.xlsx')
    
    For 
$i 1 to 250 Step 1
        Sleep
(1000)
            
        If 
not IsObj($oExcelThen
              ConsoleWrite 
('Excel not found')
              
ExitLoop
        
EndIf
        
        
$boolIsRealPage False
        $link 
$oExcel.Activesheet.Cells($i1).Value        
        ConsoleWrite 
$i ' ' $link & @LF)
        
_IENavigate($oIE$link0)       ; тут не ждем пока загрузится
        _IELoadWait
($oIE5000 15000)      ;  а тут ждем максимум 15 сек
            
if @error Then  2 попытка
                ConsoleWrite 
('2 try' & @LF)    
                
My_New_IE()            
                
_IENavigate($oIE$link0)       ; тут не ждем пока загрузится
                _IELoadWait
($oIE5000 15000)      ;  а тут ждем максимум 15 сек
            
EndIf
        if 
not @error Then
                ConsoleWrite 
(' open url ')    
                
$oLinks=_IETagNameGetCollection($oIE'a')    
                
ConsoleWrite (', get collecion a ' & @LF)    
                    
                if 
IsObj($oLinksThen
                    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($tagsThen
                        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($oIEThen
       _IEQuit
($oIE)
   EndIf   
   
$oIE=_IECreate("about:blank",1,0,1)    
        
EndFunc 



Убрал постоянное открытие закрытие IE, заменил на открытие ссылки в том же окне, добавил переоткрытие в случае ошибки/зависона.
Таймауты можно наверное переделать, но это уже не суть.

ЗЫ: Вообще IE неуклюжий монстр..

Mike909 05-11-2015 13:05 2571843

подправил скрипт выше.

garanov 05-11-2015 20:17 2571997

нды. видимо проблему у меня.
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 2571998

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

garanov 06-11-2015 07:52 2572087

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

garanov 09-11-2015 12:18 2572981

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


Время: 09:03.

Время: 09:03.
© OSzone.net 2001-