0

Unicorn HTTP サーバーのインスタンスがサーバー上で実行されています。このディレクトリにいくつかのファイルをロードします。

~/apps/myapp/current/

このパスは、このパスの最後のリリースへのシンボリック リンクです。

~/apps/myapp/releases/234234532/

これは、デプロイ時に Capistrano によって構成されます。Unicorn が適切に再起動することを確認するために、最後に呼び出される deploy:restart タスクが deploy.rb に含まれている場合でも手動で行います。これは、Unicorn に対して Capistrano にいくつかの問題があることを読んだためです。

私のアプリは、Selenium WebDriver を使用して Selenium インスタンスを起動しようとしています。ただし、それが私の問題です.Seleniumは古いリリースを指しているようです。

確かに、プロセスの重要なファイルを削除することを選択しました。これは、アプリがまだ正常に起動するかどうか、およびそれが私が期待した本当に良いリリースであるかどうかを確認するためです. うまくいけば、私のアプリは起動せず、いくつかの論理エラーが表示されました.

だから今、私は良いリリースを指していると確信しています.Seleniumの動作を理解していません. 私は説明しています:

ログ内に表示されるエラーは次のとおりです。

invalid page structure: Unable to locate element: {"method":"id","selector":"sectionSearch"}
Command duration or timeout: 1.02 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.21.0', revision: '16552', time: '2012-04-11 19:08:38'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '3.2.13-grsec-xxxx-grs-ipv6-64', java.version: '1.7.0_147-icedtea'
Driver info: driver.version: EventFiringWebDriver (org.openqa.selenium.NoSuchElementException)

要約すると、SeleniumsectionSearchは関連する HTML ページに欠落している id 要素に文句を言います。

したがって、この記事が示唆するように: http://seleniumhq.org/docs/04_webdriver_advanced.html、特定の html 要素が存在しないことを通知する前に、タイムアウトを増やしました。

wait {driver.find_element(:id, 'sectionSearch')}  

参考までに、wait はカスタム メソッドです。

def wait(timeout = 50, &block)
    Selenium::WebDriver::Wait.new(timeout: timeout).until(&block)
end

ローカル コンピューター (開発環境) では、おそらく別の SeleniumDriver: FirefoxDriver を使用しているために動作します。

def driver
    @driver ||= begin
      if Rails.env.production?
        driver = Selenium::WebDriver.for :remote, url: 'http://localhost:4444/wd/hub'
      else
        driver = Selenium::WebDriver.for :firefox
      end
      driver.manage.timeouts.implicit_wait = 20
      driver
    end
  end

しかし、ユニコーンを強制終了して再起動した後でも、サーバーで同じ問題が発生します。

invalid page structure: Unable to locate element: {"method":"id","selector":"sectionSearch"}
    Command duration or timeout: 1.02 seconds

したがって、私の最後のアクションは、サーバーのアプリケーションの現在のフォルダー内で次の行を手動で変更することでした。

wait {driver.find_element(:id, 'sectionSearch')} 

wait {driver.find_element(:id, 'sectionSearchhhhhhhh')}

今、私の期待は、Seleniumがこの欠落要素に文句を言うので、エラーは論理的です. なぜこれを行うのですか?Selenium が UPDTATED ソース ファイルを受け取ることを確認したいからです。

そして、そうではなかったようです...前のエラーと同じエラーが表示されます。

誰でもアイデアがありますか?

4

1 に答える 1

1

これはセレン エラーであり、Web ドライバーが要素に到達する前にタイムアウトしたか、間違ったセレクターを指定したためにエラーが発生しています (つまり、エラー要素が見つかりません)。私があなただったら、最も信頼性の高いロケーターと思われる xpath をセレクターとして使用します。たとえば、Google の検索ボックスを要素として考えてみましょう。ボックスの次の html コードがあります。

<input type="text" name="q" value="" id="searchText" maxlength="256"/>

上記の html コードを使用してセレン要素ロケーターを形成する方法は、次のようになります。

driver.find_element(:xpath, "//input[@name='q']")

ただし、上記の説明で気付いたように、これでは十分ではありません。暗黙の待機を設定しようとしました。あなたが望む効果を達成するためのより良い方法はこれです..

!30.times { if (driver.find_element(:xpath, "//input[@name='q']") rescue false) then break else sleep 1; end }

上記のコードは 30 回試行し、各試行の前に 1 秒待機してから目的の要素に到達します (失敗した場合は、begin/rescue 句などを使用してエラーをキャプチャできます。

begin
   .    
   .
 [your code]
   .
   .
!30.times { if (driver.find_element(:xpath, "//input[@name='q']") rescue false) then break else sleep 1; end }    
   .
   .
driver.find_element(:xpath, "//input[@name='q']") #so you cause an error that u can capture
   .
   .
rescue    
puts "A time-out error occurred or you have used an invalid element locator"
   .
   .
end

それが役立つことを願っています!

于 2012-08-10T12:06:48.167 に答える