<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><font face="Tahoma,sans-serif" color="#000000"><b>James McCaffrey</b> wrote an article in <b>MSDN Mag</b>  </font><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma,sans-serif" color="#000000"><a href="https://msdn.microsoft.com/en-us/magazine/ff955768.aspx">https://msdn.microsoft.com/en-us/magazine/ff955768.aspx</a></font></div><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma,sans-serif" color="#000000">It demonstrates how to use automate the testing of an <b>ASP.NET WebForms MiniCalculate</b> page. </font></div><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma,sans-serif" color="#000000">The specific issue is parsing out the hidden <b>viewstate</b> field. The article is from 2010 and I believe the viewstate field size has changed, causing later webforms pages with the greater viewstatew field size to be incompatible with the original McCaffrey code. fd</font></div><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma,sans-serif" color="#000000">Please, can someone help me get the code to work? </font></div><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma,sans-serif" color="#000000">Here is the <b>IRONPYTHON</b> <b>harness.py</b> code...</font></div><div><font face="Tahoma,sans-serif" color="#000000"><br></font></div><div><font face="Tahoma, sans-serif"><div># harness.py</div><div><br></div><div>import sys</div><div>import System</div><div>import clr</div><div><br></div><div><span style="font-size: 12pt;">from System import *</span></div><div>from System.IO import *</div><div>from System.Text import *</div><div>from System.Net import *</div><div>from HTMLParser import HTMLParser</div><div><br></div><div>clr.AddReference('System.Web')</div><div>from System.Web import *</div><div><br></div><div>class MyParser(HTMLParser):</div><div>   def __init__(self):</div><div>     #super().__init__(self)</div><div>     HTMLParser.__init__(self)</div><div>     #self.seen = {}</div><div><br></div><div>#d = dict([('two', 2), ('one', 1), ('three', 3)])<span class="Apple-tab-span" style="white-space:pre">    </span> </div><div>   def handle_starttag(self, tag, attributes):</div><div>     if tag != 'input': return</div><div>     a = dict(attributes)     </div><div>     if a['type'] == 'hidden':</div><div>        print a['value']</div><div>        return</div><div><br></div><div>def getVS(url):</div><div>  wc = WebClient()</div><div>  bytes = wc.DownloadData(url)</div><div>  html = Encoding.ASCII.GetString(bytes)</div><div>  </div><div>  print html</div><div>  print 'starttag begin'</div><div>  parser = MyParser()</div><div>  return parser.feed(html)</div><div><br></div><div>  #start = html.IndexOf('id="__VIEWSTATE"', 0) + 24</div><div>  #end = html.IndexOf('"', start)</div><div>  #vs = html.Substring(start, end-start)</div><div>  #return vs</div><div><br></div><div>def getEV(url):</div><div>  wc = WebClient()</div><div>  bytes = wc.DownloadData(url)</div><div>  html = Encoding.ASCII.GetString(bytes)</div><div>     </div><div>  start = html.IndexOf('id="__EVENTVALIDATION"', 0) + 30</div><div>  end = html.IndexOf('"', start)</div><div>  ev = html.Substring(start, end-start)</div><div>  return ev</div><div><br></div><div>try:</div><div>  </div><div>  print '\nBegin IronPython Request-Response testing'</div><div>  print sys.argv[0]</div><div>  url = 'http://localhost:64725/Default.aspx'</div><div>  print '\nURL under test = ' + url + '\n'</div><div>  testCases = 'testCases.txt'</div><div><br></div><div>  numPass = numFail = 0</div><div>  </div><div>  filePath = 'C:\\Users\\daniel\\Downloads\\McCaffrey\\TestRun\\testCases.txt' </div><div>  fin = open(filePath, 'r')</div><div>  </div><div>  for line in fin:</div><div>    print '======================================================================'</div><div>    (caseid,value1,value2,operation,decimals,action,expected) = line.split('|')</div><div>    </div><div>    expected = 'value="' + expected.Trim() + '" id="TextBox3"'</div><div>    data = 'TextBox1=' + value1 + '&TextBox2=' + value2 + '&Operation=' + operation + '&DropDownList1=' + decimals + '&Button1=' + action</div><div>  </div><div>    print 'Test case: ' + caseid</div><div>    print 'Input    : ' + data</div><div>    print 'Expected : ' + expected</div><div><br></div><div>    vs = getVS(url)</div><div>    ev = getEV(url)</div><div>    vs = HttpUtility.UrlEncode(vs)</div><div>    ev = HttpUtility.UrlEncode(ev)</div><div>    data = data + "&__VIEWSTATE=" + vs + "&__EVENTVALIDATION=" + ev</div><div> </div><div>    buffer = Encoding.ASCII.GetBytes(data)</div><div>    req = HttpWebRequest.Create(url)</div><div><span class="Apple-tab-span" style="white-space:pre">     </span></div><div>    #print '^^^^^^^^^^^^^^^^^^^^^^^^'</div><div>    #print req.GetResponse().Headers</div><div><span class="Apple-tab-span" style="white-space:pre">  </span></div><div>    req.Method = 'POST'</div><div>    req.ContentType = 'application/x-www-form-urlencoded'</div><div><span class="Apple-tab-span" style="white-space:pre">   </span></div><div>    print "**********************************"</div><div>    print "buffer.Length = ",  buffer.Length</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div>    req.ContentLength = buffer.Length</div><div><br></div><div>    reqst = req.GetRequestStream()</div><div>    reqst.Write(buffer, 0, buffer.Length)</div><div>    #reqst.Flush()</div><div>    reqst.Close()</div><div>    </div><div>    res = req.GetResponse()</div><div>    resst = res.GetResponseStream()</div><div>    sr = StreamReader(resst)</div><div><br></div><div>    html = sr.ReadToEnd()</div><div>    sr.Close()</div><div>    resst.Close()</div><div>  </div><div>    if html.IndexOf(expected) >= 0:</div><div>      print 'Pass'</div><div>      numPass = numPass + 1</div><div>    else:</div><div>      print '**FAIL**'</div><div>      numFail = numFail + 1</div><div><br></div><div>    print '======================================================================\n'</div><div><br></div><div>    # end main processing loop</div><div><br></div><div>  fin.close()</div><div><br></div><div>  print '\nNumber pass = ' + str(numPass)</div><div>  print 'Number fail = ' + str(numFail)  </div><div>  print '\nEnd test run\n'</div><div><br></div><div>except System.Exception, e:</div><div>  #type, value, traceback = sys.exc_info()</div><div>  print e.Message</div></font></div><div><br>Thanks,<br><font color="#800000"><font size="4" face="Lucida Handwriting, Cursive">D</font>anny <font size="4" face="Lucida Handwriting, Cursive">R</font>osales</font><strong></strong><br><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none;"></div></div>                                         </div></body>
</html>