<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://192.168.147.128/" />
<title>wrtnormalfpp</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">wrtnormalfpp</td></tr>
</thead><tbody>
<tr>
	<td>setSpeed</td>
	<td>2000</td>
	<td></td>
</tr>
<tr>
	<td>open</td>
	<td>/phpbb3/</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>username</td>
	<td>mmarrkv</td>
</tr>
<tr>
	<td>type</td>
	<td>password</td>
	<td>mmarrkv</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>login</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>link=Your first forum</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>link=Your first forum</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>link=TestTopic</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>link=TestTopic</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[1]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[1]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Hi guys, I'm new to the forum so forgive me if I'm sounding ... daft.<br /><br />I currently work in a Tech Support role. Every day we have to generate data by running around 10 .sh scripts. I was thinking instead of having to ./filename 10 times is it possible to right a new script that will run these for me on the relevant order? I'm assuming one of you guys could do this in 2 seconds, but would anyone mind pointing me in the right direction? E.g a template of what the script should look like?<br /><br />Obviously I still think myself to be a novice when it comes to UNIX, but anything to make the little jobs easier would be great!<br /><br />Cheers<br />Jamie</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[4]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[4]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Put the following in a file call runall.sh then do <br /><br />chmod +x runall.sh<br /><br />to execute use<br /><br />./runall.sh<br /><br />Code:<br />#!/bin/sh<br />for d in&nbsp;&nbsp;&nbsp;&nbsp;/path...../first-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../second-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../third-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../fourth-file.sh<br />do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RC=$?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if test &quot;$RC&quot; != &quot;0&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit $RC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br />done<br /><br />this will run the scripts and exit if there is an error returned.</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[5]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[5]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Thanks porter, appreciated!<br /><br />What does the +x specify after the chmod, isn't this normally numbers to specify read, write, execute permissions? Such as 660 or similar?<br /><br />Could you have it so if an error occurred it would ask if you wanted to continue?<br /><br />Thanks again!</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[6]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[6]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>&quot;chmod +x .... &quot; sets the &quot;executeable&quot; flags which tells the operating system this is a runable program.<br /><br />Yes you could, <br /><br />Code:<br />if test &quot;$RC&quot; != &quot;0&quot;<br />then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;continue? [y]/n&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read N<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &quot;$N&quot; in <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y* | y* ) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit $RC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esac<br />fi</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[7]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[7]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>So something along the lines of;<br /><br />Code:<br />#!/bin/sh<br />for d in&nbsp;&nbsp;&nbsp;&nbsp;/path...../first-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../second-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../third-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/path..../fourth-file.sh \<br />if test &quot;$RC&quot; != &quot;0&quot;<br />then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;continue? [y]/n&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read N<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &quot;$N&quot; in <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y* | y* ) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit $RC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esac<br />fi<br />done<br /><br />Do the .sh scripts not need to be told to &quot;./&quot;?<br /><br />Thanks porter!<br /><br />Jamie</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[8]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[8]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Depends what is on the path, in UNIX (unlike windows) you normally don't execute programs from the current directory.<br /><br />If the directory name is not in the command name then the operating system will look for programs in directories listed in the PATH variable.<br /><br />The &quot;./&quot; basically tells the OS what directory &quot;runall.sh&quot; is in. Similarly you should replace the &quot;/path....&quot; to what ever directory your scripts are in.</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[9]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[9]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>If I had 4 scripts in;<br />/usr/local/production/temp/<br /><br />And another 4 in;<br />/usr/local/production/temp/newfolder<br /><br />I could use;<br /><br />Code:<br />#!/bin/sh<br />for d in&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/first-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/second-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/third-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/fourth-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/newfolder/first-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/newfolder/second-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/newfolder/third-file.sh \<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/production/temp/newfolder/fourth-file.sh \<br />if test &quot;$RC&quot; != &quot;0&quot;<br />then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;continue? [y]/n&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read N<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &quot;$N&quot; in <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y* | y* ) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit $RC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esac<br />fi<br />done<br /><br />Where I currently work we generally go to the directory the .sh script is located and simply;<br />Code:<br />./script.sh</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[10]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[10]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Can this be done without using te system command? I have a directory with a large number of files in it, but I am interested in only the 8 most recent.<br /><br />The directory looks like<br />-rw-rw-rw- 1 adsm adsm 13412 Sep 22 08:31 events_dump_09222005.csv.gz<br />-rw-rw-rw- 1 adsm adsm 13405 Sep 21 08:31 events_dump_09212005.csv.gz<br />-rw-rw-rw- 1 adsm adsm 13237 Sep 20 08:31 <br /><br />I am getting the date out of the file to be used in another module. What I have works, but want I want to know is if it can be done without resorting to temporary file (listfiles) and the system command<br /><br />#!/usr/bin/perl<br /><br />system( 'ls -tr /adsm/DATASRC/events/ | tail -8r &gt; /adsm/SCRIPTS/BKUPINFO/listfiles');<br />open (LSTFILES, &quot;&lt;/adsm/SCRIPTS/BKUPINFO/listfiles&quot;);<br />while (&lt;LSTFILES&gt;) {<br />print($_);<br />($pt1,$pt2) = split(/_dump_/, $_ );<br />chomp($pt2);<br />print &quot;$pt2\n&quot;;<br />($pt3,$pt4) = split(/\./,$pt2);<br />print &quot;$pt3\n&quot;;<br />}<br /><br /><br /><br />close(LSTFILES);</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[11]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[11]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Yes, in fact I won't resort to shell equivalents if something can be solely done from within Perl, because this ensures the highest portability. The following will give you a list of top 8 files with the latest mtime in descending order of mtime:<br /><br />Code:<br />#!/usr/bin/perl<br /><br />my $base = &quot;/adsm/DATASRC/events/&quot;;<br /><br />opendir DIR, $base or die &quot;Cannot read dir!&quot;;<br />my @list = readdir DIR;<br />closedir DIR;<br />my @list_with_mtime = map { ($_ !~ /^\./?[$_, (stat($base . $_))[9]]:()) } @list;<br />my @r_sorted_list = map { $$_[0] } sort { $$b[1] &lt;=&gt; $$a[1] } @list_with_mtime;<br /><br /># Show top 8<br />{<br />	local $, = &quot;\n&quot;;<br />	print @r_sorted_list[0..7];<br />}</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[12]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[12]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Thanks for the reply. It absolutely does what I am looking for. <br />Now I need to understand it. My understanding of the map function is that it works like a foreach loop. Is that right?<br /><br />Can you explain this statement map { ($_ !~ /^\./?[$_, (stat($base . $_))[9]])) } @list</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[13]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[13]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>It looks complex, but it is actually quite simple if I put it in a nicer looking form.<br /><br />Code:<br />map {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$_ !~ /^\./?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$_, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(stat($base . $_))[9]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;) <br />} @list<br /><br />So we read the list of file (including directory entries) names in @list. For each name read, we carry out the following operation:<br />If the filename does not start with a &quot;.&quot;, it is not a hidden file. We will put the filename together with its mtime as an array reference to facilitate sorting later on. <br />Otherwise, a hidden file is ignored by yielding an empty array. <br /><br />It will pass through every entry of @list and collect the evaluated value in the map{} block and return the aggregated list. At the end of this statement we will get an array of array references containing the filename and the corresponding mtime. Entries that yield an empty array are ignored because an empty array upon interpolated in a list will &quot;dissolve&quot; itself. The net effect in this piece of code is that hidden files will disappear from the resulting, aggregated list. This is what we want if we want to ignore all hidden files.<br /><br />i.e. (&quot;a&quot;, &quot;b&quot;, (), &quot;c&quot;) will give (&quot;a&quot;, &quot;b&quot;, &quot;c&quot;) so this is how this trick works.<br /><br />Yes, the next statement sorts this intermediate list in descending order of mtime, and then reconstruct an array with filenames only (by cleaning the temporary mtime values and removing the references).</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[4]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[4]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Thank you for the reply.<br /><br />I am also trying to understand the sort statement { $$_[0] } sort { $$b[1] &lt;=&gt; $$a[1] . I understant what it does but what I am not familiar with is the $$.</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[5]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[5]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>As I said, I have made some temporary references with the first statement. In my case this is an array reference (think about it like a pointer to an array) containing the filename together with the mtime as two separate array items. <br /><br />To access an item from a normal array by index you will<br /><br />$array[0], $array[1]<br /><br />If the corresponding array is pointed to by a reference and you need to access an item through the reference, that becomes<br /><br />$$arrayref[0], $$arrayref[1]<br /><br />OR (both syntax will work)<br /><br />$arrayref-&gt;[0], $arrayref-&gt;[1]<br /><br />which literally means &quot;dereference and then index in the underlying array&quot;.<br /><br />Understanding these require some knowledge about references in Perl. <br /><br />The official page that talks about this:<br />http://perldoc.perl.org/perlref.html</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[6]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[6]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Hello,<br /><br />I'm very new to PHP but am well versed with HTML and CSS. I have taken a couple of intro courses in C and VB so I am familiar with basic programming outside of a web enviroment. I have been doing website work for about a year now and I have the need for a very basic login script.<br /><br />The non-profit site I'm working on needs a single page password protected and I have chosen PHP to do it because from what I've read it sounds like the best solution and I like that it is similar in syntax to C. I only need 1 general login account setup so I don't want to use an array or a database since that is way overkill.<br /><br />Here's my form which falls on the login.php page:<br /><br />Code: Select all <br /><br />&lt;form name=&quot;LoginForm&quot; method=&quot;post&quot; action=&quot;members.php&quot;&gt;<br />&lt;table width=&quot;200&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;<br />&lt;tr&gt;<br />&lt;td&gt;Username&lt;/td&gt;<br />&lt;td&gt;&lt;input name=&quot;userForm&quot; type=&quot;text&quot; size=&quot;20&quot; maxlength=&quot;20&quot; /&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td&gt;Password&lt;/td&gt;<br />&lt;td&gt;&lt;input name=&quot;passwordForm&quot; type=&quot;password&quot; size=&quot;20&quot; maxlength=&quot;20&quot; /&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;center&gt;<br />&lt;input class=&quot;btn&quot; type=&quot;submit&quot; value=&quot;Login&quot; /&gt;<br />&lt;/center&gt;<br />&lt;/form&gt;<br /><br /><br />and here's my php code which falls on the members.php page:<br /><br />Code: Select all <br />&lt;?php<br />$user=&quot;admin&quot;;<br />$password=&quot;password&quot;;<br />$userForm=$_POST['userForm'];<br />$passwordForm=$_POST['passwordForm'];<br /><br />if (($userForm == $user) &amp;&amp; ($passwordForm == $password)){<br /><br />}else{<br />header(&quot;Redirect:failed.php&quot;); <br />}<br />?&gt;<br /><br /><br />The header command might be totally wrong at this point because I've been substituting different code trying to get this to work. What's happening is that if you put in the correct login info you go to the members.php page no problem, but if you put in the wrong login it is still taking you to the members.php page. Also since I've been trying to use the header function I still end up on the members.php page but with a header error at the very top saying the header has already been sent.<br /><br />I have been searching and reading and testing now since last Friday and I am very frustrated at this point. All I want is to have a redirect if the login is wrong to another page and I can't seem to make this work right.<br /><br />I feel I am very close to a solution but its the last bit that is not availing me.<br />Thanks in advance for your time and info. Any help is greatly appreciated.<br /><br />-WS-</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[7]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[7]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Did pretty good for being a n00b. <br /><br />the correct syntax is: header(&quot;Location:failed.php&quot;);<br /><br /><br />Make sure that you're not sending any HTML headers before this function is called, otherwise it might/will fail. <br /><br />However, if I were you, I would add just a little bit of added certainty that the login process will be more successful. <br /><br />Code: Select all <br />$user = &quot;admin&quot;;<br />$password = &quot;password&quot;;<br />$userForm = trim($_POST['userForm']);<br />$passwordForm = trim($_POST['passwordForm']);<br /><br /><br /><br />The trim() function will kill the whitespaces in front of or behind the input data</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[8]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[8]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Thanks egami I have been researching for days now so I got that far lol.<br /><br />I did end up finding the issue. I had a couple white lines before my &lt;php tag started for ease of viewing the top of the page in Dreamweaver. I didn't know this was an issue and figured the lines would be ignored.<br /><br />The trim function checks for a previously sent header?</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[9]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[9]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>php.net/trim<br /><br />It just removes white spaces from the string.<br />I use it in case people hit the keyboard after inputting a username and or password. <br />It's more of a &quot;let's make sure the input data is pure&quot; kind of thing.<br /><br />You could also do a trim(strip_tags($_POST['data'])) as another form of purification, although since I use MySQL for most of my authentication, I prefer to use mysql_real_escape_string(trim(strip_tags($_POST['data'])))</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//div[@id='page-body']/div[10]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//div[@id='page-body']/div[10]/div[1]/div/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>message</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>message</td>
	<td>Login Script with PDO can use the PDO extension to connect to a specified database and perform several account management operations.<br />You can download <br />http://www.phpkode.com/scripts/item/log ... -with-pdo/</td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>//li[@id='attach-panel-tab']/a/span</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>//li[@id='attach-panel-tab']/a/span</td>
	<td></td>
</tr>
<tr>
	<td>runScript</td>
	<td>netscape.security.PrivilegeManager.enablePrivilege(&quot;UniversalFileRead&quot;); document.getElementById(&quot;fileupload&quot;).value = &quot;/home/mvella/Desktop/phpforum.zip&quot;;</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>add_file</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>preview</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>post</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>link=Board index</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>link=Board index</td>
	<td></td>
</tr>
<tr>
	<td>waitForElementPresent</td>
	<td>link=Logout [ mmarrkv ]</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>link=Logout [ mmarrkv ]</td>
	<td></td>
</tr>
</tbody></table>
</body>
</html>
