<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>donychen (陈东)</title>
    <link>https://ruby-china.org/donychen</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby mechanize 模拟网页填表登陆的问题</title>
      <description>&lt;p&gt;大家好！&lt;/p&gt;

&lt;p&gt;我在今天使用 ruby mechanize 框架进行网页填表，模拟登陆的过程中发现一个问题。&lt;/p&gt;

&lt;p&gt;首先，描述一下我要填表并登陆的网页。
若干 text 框需要填写，若干 checkbox 框需要选择。
还有几个 checkbox，选择后，网页会 post，然后才会生成后面的 post 选项。类似我们填简历时候，选择某地区，后面才会出现该地区的学校，再会出现该学校的专业一样。&lt;/p&gt;

&lt;p&gt;我在 ruby 脚本里面填了所有的需要填的东西，和我手动在网页上面填的一模一样。&lt;/p&gt;

&lt;p&gt;然后模拟点击添加按钮，依旧在本页面。但是手动就会添加成功。&lt;/p&gt;

&lt;p&gt;手动添加时候，也会出现点击添加留在本页面的问题，但是那是因为需要填写的框没有填够，并且在网页头部会给出错误原因。&lt;/p&gt;

&lt;p&gt;网页模拟时候，我把整个页面下载下来，没发现有错误提示。&lt;/p&gt;

&lt;p&gt;很困惑这是因为什么。&lt;/p&gt;

&lt;p&gt;不知道有没有懂的大神，求请教。非常感谢。&lt;/p&gt;</description>
      <author>donychen</author>
      <pubDate>Fri, 26 Jun 2015 10:38:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/26189</link>
      <guid>https://ruby-china.org/topics/26189</guid>
    </item>
    <item>
      <title>RestClient 使用过程中的网页 POST 请求问题</title>
      <description>&lt;p&gt;Hello 大家好，没错，作为一枚新手 ruby 菜鸟以及 HTML 小白，我又来了。。。&lt;/p&gt;

&lt;p&gt;今天想问大家一个问题：
如何使用 ruby gem 中的 restclient 来登陆一个网页，并返回登陆后的界面。
或者大家有其他好方法，可以达到这个目的。
前提是：用命令行执行脚本，不能用模拟打开浏览器的方法，类似 waitri-webdriver。服务器端没有浏览器可以用（或者我小白，还不知道？）
麻烦各位大神了。
下面是我用 restclient 的过程中遇到的问题。&lt;/p&gt;

&lt;p&gt;====================================分割线=========================================&lt;/p&gt;

&lt;p&gt;模拟登陆 Ruby China 社区
&lt;img src="https://l.ruby-china.com/photo/2015/271e3df7b13a85a821c451101c1b6723.jpg" title="" alt=""&gt;
上图是用 firebug 查看到的 post 请求的参数，根据参数写出 post 登陆代码。&lt;/p&gt;

&lt;p&gt;代码如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'restclient'&lt;/span&gt;

&lt;span class="no"&gt;LOGIN_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://ruby-china.org/account/sign_in"&lt;/span&gt;

&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;RestClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;LOGIN_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'user[login]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user[password]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user[remember_me]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'commit'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'登录'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'utf8'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'✓'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'authenticlty_token'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxxxxxxxxxxxxxxxxxxxxxx'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里会报一个如下的错误：
gems/ruby-2.2-head/gems/rest-client-1.8.0/lib/restclient/abstract_response.rb:65:in `return!': 302 Found (RestClient::Found)
网页我写的参数通过了，但是网页没有跳转到我想要的结果去。&lt;/p&gt;

&lt;p&gt;我在网上查了一下，看到一段 java 代码说要根据重定向返回的 response 来 get 新的页面。我又写了如下代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'restclient'&lt;/span&gt;

&lt;span class="no"&gt;LOGIN_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://ruby-china.org/account/sign_in"&lt;/span&gt;

&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;RestClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;LOGIN_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'user[login]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user[password]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user[remember_me]'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'commit'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'登录'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'utf8'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'✓'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'authenticlty_token'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'xxxxxxxxxxxxxxxxxxxxxxxx'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;307&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;code&lt;/span&gt;
    &lt;span class="c1"&gt;#response.follow_redirection(request, result, &amp;amp;block)&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cookies&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;return!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是会提示我 instance variable &lt;a href="/cookie_jar" class="user-mention" title="@cookie_jar"&gt;&lt;i&gt;@&lt;/i&gt;cookie_jar&lt;/a&gt; not initialized
应该是没拿到 cookie。&lt;/p&gt;

&lt;p&gt;可以显示到 response.headers，这里面有个链接
用 response.headers[:location] 可以拿到，但是用 get 方法打开这个链接后，我发现还是登陆前的页面。&lt;/p&gt;

&lt;p&gt;====================================分割线=========================================&lt;/p&gt;

&lt;p&gt;求助！求助！感激不尽！&lt;/p&gt;</description>
      <author>donychen</author>
      <pubDate>Tue, 09 Jun 2015 15:56:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/25944</link>
      <guid>https://ruby-china.org/topics/25944</guid>
    </item>
    <item>
      <title>Linux shell 问题，求解</title>
      <description>&lt;p&gt;大家好！
我在写脚本时候遇到一个问题：
执行一个脚本，比方：update.sh
这个脚本会由于环境的一些原因，出现两种不同的输出。
如果正确的情况下：程序输出一个进度条“...........”类似这样。
错误的情况下，会出现类似“ERROR"这样的结果。&lt;/p&gt;

&lt;p&gt;但是程序执行后，echo $?总是 0
我尝试用 expect 来拿不同的结果，但是感觉力不从心，expect 更倾向于解决交互性输入的问题，在这里感觉不是很好用。
有没有大神了解这种情况下，我应该怎么根据不同的输出，得出不同的结果呢？&lt;/p&gt;

&lt;p&gt;非常感谢！&lt;/p&gt;</description>
      <author>donychen</author>
      <pubDate>Thu, 04 Jun 2015 14:27:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/25881</link>
      <guid>https://ruby-china.org/topics/25881</guid>
    </item>
    <item>
      <title>新手请教下，大家使用过 ruby expect 么？</title>
      <description>&lt;p&gt;本人 ruby 新手，最近使用 expect 和 shell 写了一些脚本，想用 ruby 重写，但是不知道 ruby 中的 expect 怎么用，网上找了好久都没有结果。希望知道的大神指教一二。&lt;/p&gt;

&lt;p&gt;我是做自动化的脚本，过程是需要安装一款软件，这款软件的安装方式类似下面这种情况：&lt;/p&gt;

&lt;p&gt;首先解压开，然后调用其中的安装脚本后，会有如下提示：&lt;/p&gt;

&lt;p&gt;please input install folder:
/home/user   (这部分需要用户输入)
please input the version you choose:
2.0    (这部分需要用户输入)
。。。&lt;/p&gt;

&lt;p&gt;类似这种形式。
我以前用 expect 脚本写的话，就每次截取上次的屏幕输出。&lt;/p&gt;

&lt;p&gt;但是现在想转用 ruby。
不知道大家有没有用过 ruby expect，或者还有什么其它解决这类交互式安装的好方法，请麻烦告诉我一下。&lt;/p&gt;

&lt;p&gt;或者可以贴个有类似资料的地方我自己学习。&lt;/p&gt;

&lt;p&gt;希望大家不吝赐教，感激不尽。&lt;/p&gt;</description>
      <author>donychen</author>
      <pubDate>Wed, 06 May 2015 17:34:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/25461</link>
      <guid>https://ruby-china.org/topics/25461</guid>
    </item>
  </channel>
</rss>
