Jump to content
Sign in to follow this  
Chimp

how to change an object style in a web page?

Recommended Posts

Chimp

Hello,

how can I change the "style" property of an <img> tag?
i tried with this short example, but without sucess.
what am I doing wrong?

#include <IE.au3>
$oIE = _IECreate()
; Here I create a web page with an image inside, with the style="border:5px solid green"
Local $sHTML = '<html><body><img src="http://aut1.autoit-cdn.com/site/wp-content/themes/TheCorporation/images/logo@2x.png" width="210"height="72" alt="AutoItScript" id="logo" style="border:5px solid green" /></body></html>'
_IEBodyWriteHTML($oIE, $sHTML)
Sleep(3000) ; a pause and then I remove the border
; here I change the body content like the above but without the border (without style="border:5px solid green")
Local $sHTML = '<html><body><img src="http://aut1.autoit-cdn.com/site/wp-content/themes/TheCorporation/images/logo@2x.png" width="210"height="72" alt="AutoItScript" id="logo" /></body></html>'
_IEBodyWriteHTML($oIE, $sHTML)

; now I would like to set the border again around the image
; but without success

Local $oImg = _IEImgGetCollection($oIE, 0)
Local $bodyImg = _IEDocGetObj($oImg)

; --- zone of mistakes ----

$bodyImg.style = "border:5px solid green" ; <-- this fails
; : ==> The requested action with this object has failed.:

_IEPropertySet($bodyImg, "style", "border:5px #FF0000") ; ; <-- this fails
;--> IE.au3 V2.4-0 Error from function _IEPropertySet, $_IEStatus_InvalidValue (Invalid Property)


$oImg.style = "border:5px solid green" ; <-- this fails
_IEPropertySet($oImg, "style", "border:5px #FF0000") ; ; <-- this fails

any help is welcome
thanks

Edited by Pincopanco

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
abberration

I think your problem lies in the fact that you are only viewing an image on a blank HTML page. Look at the source code of the page and it is:

<HTML></HTML>

Therefore, _IEImgGetCollection has no data to collect. I think you need to try your code with an actual HTML page.


RAID Calculator | Software Installer

The truth has been suppressed since the dawn of time.

Share this post


Link to post
Share on other sites
dragan

You need to set the "style" attribute to your image object (answer lies here: http://msdn.microsoft.com/en-us/library/ie/ms536739%28v=vs.85%29.aspx )

#include <IE.au3>
$oIE = _IECreate()



Local $sHTML = '<html><body><img src="http://aut1.autoit-cdn.com/site/wp-content/themes/TheCorporation/images/logo@2x.png" width="210"height="72" alt="AutoItScript" id="logo" /></body></html>'
_IEBodyWriteHTML($oIE, $sHTML)









Local $AllImages = _IETagNameGetCollection($oIE, 'img')
For $OneImage in $AllImages
    If $OneImage.id = 'logo' Then
        MsgBox(0, '', 'about to change')
        $OneImage.setAttribute("style", "border:5px solid green;")
        MsgBox(0, '', 'after changing')
    EndIf
Next
Edited by dragan
  • Like 1

Share this post


Link to post
Share on other sites
Chimp

Thanks for answers

@aberration
I also have seen the "short" html listing, but if you press F12 developer tools (I have IE8) you will see the whole html listing there. Strange behavior :think:

@dragan
well, I see that also running your script, no success is achieved, but, again, if you press F12 in the browser, is possible to note that before the setAttribute() statement, no style argument is present in the listing, but after the setAttribute(), this time is present the style attribute in the page source, but it is empty like this -> style="". Strange behavior again :huh2:
also, reading at the link you provided, it says: AttributeValue Type:Variant, how can it be passed as variant?

thanks to both for suggestions.

..... my doubts still remains :blink:

edit:

@aberration

I have also tried it on real html pages, but with the same result.

Edited by Pincopanco

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
dragan

It works for me, win 7, 64-bit, ie v10

Share this post


Link to post
Share on other sites
Chimp

It works for me, win 7, 64-bit, ie v10

 

it doesn't for me win xp-sp3 32-bit ie v8 :(

some workarounds ? :rolleyes:

edit:

autoit v3.3.8.1

IE.au3 V2.4-0

Edited by Pincopanco

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
dragan

There's always a workaround:
 

#include <IE.au3>
$oIE = _IECreate()
Local $sHTML = '<html><body><img src="http://aut1.autoit-cdn.com/site/wp-content/themes/TheCorporation/images/logo@2x.png" width="210"height="72" alt="AutoItScript" id="logo" /></body></html>'
_IEBodyWriteHTML($oIE, $sHTML)
Local $AllImages = _IETagNameGetCollection($oIE, 'img')
For $OneImage in $AllImages
    If $OneImage.id = 'logo' Then
        If $OneImage.getAttribute("style") = '' Then
            MsgBox(0, '', 'about to change')
            $OneImage.outerhtml = StringTrimRight($OneImage.outerhtml, 1) & ' style="border:5px solid green;">'
            MsgBox(0, '', 'after changing')
        Else
            MsgBox(0, '', 'about to change')
            $OneImage.setAttribute("style") = "border:5px solid green;"
            MsgBox(0, '', 'after changing')
        EndIf
        ExitLoop
    EndIf
Next
Edited by dragan
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
Chimp

Hello dragan
thanks for your interesting script.
from tests I have done with your scrip it is found that:

1) when I run the script on win7 - IE10, it works well and the instruction that is executed is the one with "outerHTML"

$OneImage.outerhtml = StringTrimRight($OneImage.outerhtml, 1) & ' style="border:5px solid green;">' ; OK on Win7/IE10

however, it also works if I force the execution of setAttribute

$OneImage.setAttribute("style") = "border:5px solid green;" ; also OK on Win7/IE10

------------------------

2) if I run the script on winXP - ie8 then the statement that is executed is the one with "setAttribute", but it fails and does not draw the border

$OneImage.setAttribute("style") = "border:5px solid green;" ; this Fails on WinXP/IE8

However, if I force the execution of "outerHTML" workaround on winXP then it works

$OneImage.outerhtml = StringTrimRight($OneImage.outerhtml, 1) & ' style="border:5px solid green;">' ; OK on WinXP/IE8

thanks again dragan for your tip, and the workaround.

well, now my best goal would be to be able to run the "$OneImage.setAttribute" statement on WinXP/IE8, because it should be the best way to turn on and turn off often and quickly that border.

I also hope to find the final solution because I would like to understand if it is possible or not in some way be able to use SetAttribute on IE8

any solution is always welcome
 

thanks

Edited by Pincopanco

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites
dragan

Well, this is a WILD guess, I've no idea if this will work on IE8, but it seems that style is ALSO an object, so you use "SetAttribute" function to "style":

#include <IE.au3>
$oIE = _IECreate()
Local $sHTML = '<html><body><img src="http://aut1.autoit-cdn.com/site/wp-content/themes/TheCorporation/images/logo@2x.png" width="210"height="72" alt="AutoItScript" id="logo" /></body></html>'
_IEBodyWriteHTML($oIE, $sHTML)
Local $AllImages = _IETagNameGetCollection($oIE, 'img')
For $OneImage in $AllImages
    If $OneImage.id = 'logo' Then
        MsgBox(0, '', 'about to change')
        $OneImage.style.setAttribute('border', '5px solid green')
        MsgBox(0, '', 'after changing')
        ExitLoop
    EndIf
Next
Edited by dragan
  • Like 1

Share this post


Link to post
Share on other sites
Chimp

well,  your wild guess was right! :)
now it work fine also on WinXP/IE8.

Nice job dragan! :thumbsup:
Thanks again
bye


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • careca
      By careca
      Hi, i feel im close to getting it to work, but there must be something im missing that's probably easy for you experts.
      #include <IE.au3> #include <File.au3> #include <MsgBoxConstants.au3> $Visible = 1 Local $oIE $oIE = _IECreate("https://beemp3s.net/mp3-download.html", 0, $Visible, 1, 1) _IELoadWait($oIE) If $oIE <> @error Then ;_ArrayText() _QuerySite('Finding Hope - Without You') ;_IEQuit($oIE) ;Exit Else MsgBox(64 + 262144, 'Fail', 'Could not create a new window') EndIf ;============================================================================= Func _QuerySite($Name) Local $oIE_ObjectToSearch = _IEGetObjById($oIE, 'query') _IEDocInsertText($oIE_ObjectToSearch, $Name) Local $oIE_ObjectToClick = _IEGetObjById($oIE, "search-action") _IEAction($oIE_ObjectToClick, 'click') _IELoadWait($oIE, 2000) ;============================================================================= Local $oSubmitClick = _IEGetObjById($oIE, "col-md-12") _IEAction($oSubmitClick, "click") _IELoadWait($oIE, 2000) ;============================================================================= Local $oBtns = _IETagNameGetCollection($oIE, "div") For $oBtn In $oBtns If String($oBtn.classname) = "col-md-12" Then If String($oBtn.innertext) = "Download / Play" Then ConsoleWrite($oBtn.innertext & @CRLF) _IEAction($oBtn, 'click') EndIf EndIf Next ;============================================================================= ;Local $oElements = _IETagNameAllGetCollection($oIE) ;For $oElement In $oElements ; If $oElement.id Then MsgBox($MB_SYSTEMMODAL, "Element Info", "Tagname: " & $oElement.tagname & @CRLF & "id: " & $oElement.id & @CRLF & "innerText: " & $oElement.innerText) ;Next ;============================================================================= ;_IEQuit($oIE) ;Exit ;============================================================================= EndFunc ;==>_QuerySite ;============================================================================= Func _ArrayText() If FileExists('Titles.txt') Then Local $FO = FileOpen('Titles.txt') Local $R2A = FileReadToArray($FO) Local $iLineCount = @extended FileClose($FO) For $f = 0 To $iLineCount - 1 ConsoleWrite($f & ' - ' & $R2A[$f] & @CRLF) _QuerySite($R2A[$f]) Next Else MsgBox(64 + 262144, 'Fail', 'Could not find the file Titles.txt') EndIf EndFunc ;==>_ArrayText ;============================================================================= The idea is to get into this site, write into the search and click, which i did, but now the problem is clicking in any of the buttons in the results page, im looking for a way to click the first one, it always matches to what i want, so no need to fiddle around.
      Site
      Thanks for help in advance.

    • yoschga
      By yoschga
      is there a possibility to let ie.au3 click into a form? i use on a project where i need to click into a form where items are loaded just writing it in or fill the form is no option
       

    • RamaKrishna9
      By RamaKrishna9
      What are the minimum system requirements(like Windows OS version, IE browser version, etc,.) for IE.au3(3.3.14.2) to work properly?
    • MakzNovice
      By MakzNovice
      Hello Experts,
      I am working on modifying table data of a browser currently in IE (soon in FF)
      My sequence of operations:
      1. Activate Browser
      2. Get Browser table
      3. Modify data  in table
      4. Suppress any warning/error message from webpage
      5. Activate the Webpage again 
      6. Send {F11} key sequence twice to achieve some update without Updating form ( {F5})
       
      My problem is at Step 5, as it activates the wrong window ( last used application rather than my browser window)
      My code snippet for it as follows
      $bFoundWindow = False Local $aList = WinList("[REGEXPTITLE:(?i)(.*Internet Explorer.*)]") Local $hWND = 0 For $i = 1 To $aList[0][0] If False = $bFoundWindow And $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 1) Then WinActivate($aList[$i][1]) ; 1. Activate Browser window WinSetState ( $aList[$i][1], "", @SW_MAXIMIZE) $hWND = $aList[$i][1] $objEditIE = _IEAttach ($aList[$i][1], "hwnd") $oTitles = _IETagNameGetCollection($objEditIE, "TITLE") For $oTitle In $oTitles $sTitle = $oTitle.innerText If $sTitle = $searchString Then MsgBox(0,"APPLICATION Found", "Got Edit List Window", 1) $bFoundWindow = True ExitLoop EndIf Next EndIf Next If False = $bFoundWindow Then MsgBox(0,"Error","Please launch Edit window for updating values in Browser prior to script execution",10) Exit EndIf ; MY CODE HERE TO MODIFY TABLE ; 2. Get Browser table ; 3. Modify data  in table ; Check if message from webpage pop-up window exists if so click ok on it Local $nCounter = 0 Local $nMaxCounter = 5 while 1 If WinExists("Message from webpage","") Then ControlClick("Message from webpage","","Button1","primary",1) ;4. Suppress any warning/error message from webpage Else $nCounter = $nCounter + 1 Sleep(100) ;MsgBox(0,"Counter", $nCounter, 1) If $nCounter = $nMaxCounter Then ExitLoop EndIf WEnd ;5. Activate the Webpage again  WinActivate($hWND) ; have already tried WinActivate($aList[$i][1]) but no success ;6. Send {F11} key sequence twice to achieve some update without Updating form ( {F5}) Send("{F11}") WinActivate($hWND) ;WinActivate($aList[$i][1]) Sleep(100) Send("{F11}") Any support will be highly appreciated
    • MakzNovice
      By MakzNovice
      Hello Experts,
      I am working on custom application details of which I am unable to share.
      But here is statement of my problem, I have two IE windows one window with Title "Parent " and other with "TableEdit", but for some reason when I get WinList they are shown as 2 processes each. ( see attached image)
      Since my most important motive is to modify table data in 'TableEdit' I try to access the table in it
      My code snippet is 
      ***********************************************************************************************
      $searchString = "TableEdit"
      Local $aList = WinList("[REGEXPTITLE:(?i)(.*Internet Explorer.*)]")
      _ArrayDisplay($aList)
      For $i = 1 To $aList[0][0]
          If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) Then
              ;MsgBox($MB_SYSTEMMODAL, "", "Title: " & $aList[$i][0] & @CRLF & "Handle: " & $aList[$i][1])
              If 0 <> StringInStr($aList[$i][0],"TableEdit") Then
                  $objEditIE = _IEAttach ($aList[$i][1])
                  ExitLoop
              EndIf
          EndIf
      Next
      WinActivate($objEditIE)
      $oPageContentListFrame = _IEFrameGetObjByName($objEditIE, "iframe_1")
      $iNumFrames = @extended
      MsgBox(0,"Got pagecontent",@error) ; returns 3, indicating invalid data type
      MsgBox(0,"Number of Frame",$iNumFrames) ; returns 1, expected value is 1 
      ***********************************************************************************************
      and If I do code as below the return value is different
      $searchString = "TableEdit"
       $objEditIE = _IEAttach ($searchString, "title")
      WinActivate($objEditIE)
      $oPageContentListFrame = _IEFrameGetObjByName($objEditIE, "iframe_1")
      $iNumFrames = @extended
      MsgBox(0,"Got pagecontent",@error) ; returns 0
      MsgBox(0,"Number of Frame",$iNumFrames) ; returns 0. expected value is 1
      ***********************************************************************************************
      What is wrong with my code? 
      Why do I see two process each for IE for each window?
       
      WinListImage.bmp
×