Ruby Selenium要素の待機

このQ&Aのポイント
  • Rubyの初心者がSeleniumを使って要素の待機を行いたい
  • スクレイピングを行う際に404エラーが発生し、要素が見つからない場合には再試行したい
  • 参考になるサイトを見ながら試行錯誤をしているが、うまくいっていない
回答を見る
  • ベストアンサー

Ruby Selenium 要素の待機

Rubyの初心者でSeleniumを使ってスクレイピングを趣味としてしているものです。 ブラウザはchromeです。 スクレイピングをしたいページで404が数回続き、やっと読み込めるサイトがあるので、404エラーで止まってしまうのである要素が無ければもう一度やり直す、そのようになったら初めからやり直してみる形にしたいと思って色々と調べ試行錯誤をしています。 https://www.qoosky.net/references/58/ を参考に require 'selenium-webdriver' driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 driver.navigate.to "http://google.com" wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds begin element = wait.until { driver.find_element(:id => "hoge") } ensure driver.quit driver.navigate.to "http://google.com" end id、hogeが無ければもう一度読み直すような形でやってみたのですが全く意味をなしていないようです。 何卒どうかご教授、よろしくお願いします。

  • Ruby
  • 回答数3
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.3

>google.rb:35:in `rescue in try': undefined method `縲€if' for main:Object (NoMet hodError) 私の回答をコピペして空白が全角のままではありませんか? 全角空白と半角空白の区別が付くエディタを使いましょう。

kann3589
質問者

お礼

terapadを使っているにもかかわらず全角空白表示をオフにしていました。 早速全角を半角に置換して実行した所上手く成功しました。 最後までご指導いただき、本当にありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.2

>どのように組めばいいかも分かっていない状態です。 何がわからないのかわからないです。 >例外、404に行くとSelenium::WebDriver::Error::NoSuchElementErrorでコード自体が落ちてしまいます。 ですから、その落ちる部分を私の書いた、「例外が起こるかもしれないことをする」に書けば良いのですが。

kann3589
質問者

お礼

ありごとうございます。 ご伝授通りもう一度試してみました。 require 'selenium-webdriver' def try(n=10) # 例外が起こるかもしれないことをする driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 driver.navigate.to "https://www.google.co.jp/" #URL移動 driver.find_element(:xpath, '//*[@id="hoge"]').click sleep 2 driver.quit #ブラウザ終了 rescue => e  if n==0   raise e  else   try(n-1)  end end try 上記を試しに実行しました。 hogeは存在しないので絶対に落ちます。 エラーがこのように出ました。 google.rb:35:in `rescue in try': undefined method `縲€if' for main:Object (NoMet hodError) from google.rb:5:in `try' from google.rb:42:in `<main>'

  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.1

Seleniumは使ったことないですが、例外が上がったときに一定回数リトライするために私が使っている方法です。これがベストでは無いと思いますが。 def try(n=10)  例外が起こるかもしれないことをする rescue => e  if n==0   raise e  else   try(n-1)  end end try

kann3589
質問者

お礼

ありがとうがとうございます。 一応試してみたのですが上手くいきませんでした。 どのように組めばいいかも分かっていない状態です。 例外、404に行くとSelenium::WebDriver::Error::NoSuchElementErrorでコード自体が落ちてしまいます。 seleniumIDEでは rescue Selenium::WebDriver::Error::NoSuchElementError false end の出力でこのような感じで載っているので何か分かればと思っています。 また、ifで回避しようと試みましたが上手くいきませんでした。

関連するQ&A

  • RubyでCSVファイルの1行目を削除したい 

    Rubyの初心者でSeleniumを使ってスクレイピングを趣味としてしているものです。 ブラウザはchromeです。 この間、例外が上がったときに一定回数リトライする方法をご伝授頂きました。 http://okwave.jp/qa/q8722965.html そしてそれを活用して、CSVにスクレイピングをしたいURLを1列目に並べ、複数のページをスクレイピングしているのですが、 def try(n=10) require 'pp' require 'csv' require 'selenium-webdriver' require 'open-uri' hoge_path = File.expand_path('../hoge.csv',__FILE__) driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 CSV.foreach(hoge_path) do |row| driver.navigate.to row[1] #URL移動 #ページの移動など driver.quit #ブラウザ終了 driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 end rescue => e if n==0 raise e driver.quit #ブラウザ終了 else driver.quit #ブラウザ終了 try(n-1) end end try よく仕組みを理解できていないのですが、CSV.foreach内はループされます。 そして、404エラーなどで落ちるとまた一行目に戻ってスクレイピングが行われ、非常に困っています。 そこで、CSVファイルの1行目をループするまたは例外のリトライの際に削除していけば良いと考えたのですが、一行目を削除するというコードをどう書けばいいのか分かりません。 どうかご伝授お願いします。

    • ベストアンサー
    • Ruby
  • Ruby Selenium リンクの取得方法

    こんばんは。 Ruby初心者ですが、現在、Selenium Webdriver、chromeにはまり、スクレイピングのような事をしています。 そんな中で困っている事があるのですが、 とあるサイトの画像URLを取得、テキストに追記で書き出ししようと色々と調べたのですが全く分からず困っています。 <div class="hoge"> <img src="http://hoge" alt=""> </div> htmlはこんなようでxpathは/hoge/imgと仮定します。 open("hoge.txt", "a"){|f| output = driver.find_element(:xpath, '/hoge/img') f.puts "#{output.text}" } のように書いてみたもののテキストに改行しか出力されない状態です。 何卒どうかご教授、よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby Seleniumで文章の保存

    こんばんは。 当方Ruby初心者です。 現在、Selenium Webdriverでスクレイピングをしており、 その中でputs driver.page_sourceコマンドを使用しています。 その際、putsコマンドで出力されたソースをPC内にファイルとして保存する事は可能 でしょうか?また、可能な場合、どのようにして実行すれば良いのでしょうか。 拙い質問ですが、どうかご教授の程、よろしくお願いします。

  • LIFeBOOK UH

    seleniumをインストールすることができません。 yahooやgoogleに載っているどの方法をやってみても driver=webdriver.Chrome() のときにエラーが出ます。 対処方法を教えてください。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • Selenium Type Library参照設定

    Selenium Type Libraryを参照設定すると「DLL 読み込み時のエラーです」 https://lil.la/archives/3436 のページに記された手順でSeleniumBasicやChrome Driverをインストールし、VBEから「Selenium Type Library」を参照設定すると「DLL 読み込み時のエラーです」と表示されます。同じことを別のPCで試したところ、そちらではエラーが発生せず、実際にChromeからのWebスクレイピングに成功しました。 Excel自体の再インストールが必要なのでしょうか?

  • エクセルのスクレイピングでエラー

    エクセルVBAでスクレイピングをしたいのですが、エラーが出てしまいます。わかる方がいましたらご教授下さい。 ■環境 Windows10(64bit) ■インストールしたドライバ類 SeleniumBasic-2.0.9.0.exe ChromeDriver 91.0.4472.19 chromedriver_win32.zip ■チェックを入れた参照設定 Visual Basic For Application Microsoft Excel 16.0 Object Library OLE Automation Microsoft Office 16.0 Object Library Microsoft Internet Control Microsoft HTML Object Library Selenium Type Librrary ■プロシージャ Sub test()   Dim Driver As New Selenium.WebDriver Driver.Start "chrome", "https://www.yahoo.co.jp/" Driver.Get "/" Driver.Close Set Driver = Nothing End Sub ■エラー内容 3行目「Driver.Start "chrome", "https://www.yahoo.co.jp/"」の所で 「実行時エラー33」が表示される

  • seleniumでIEのテスト

    seleniumでIEのテスト こんにちは 今日一日seleniumのテストをしていたのですが、どうしても出来ないことがあります。 それはIEの起動が出来ません。 selenium自体はFireFoxで使用されている方が多いと思いますが、IEでもテストしたいという需要は必ずあると思うのですが、どうやってIEを起動させているのでしょうか?? 私はRCを使用して起動しようとしているのですが、どうしても出来ません。 以下ソースを実行すると、以下の様なエラーが発生します。 C:\selenium\SeleniumDemo>java -jar selenium-server.jar -htmlSuite "*iexplore" " http://www.google.co.jp" C:\selenium\SeleniumDemo\suite.html C:\selenium\Seleniu mDemo\TestResult.html -timeout "60000" 22:28:16.690 INFO - Java: Sun Microsystems Inc. 16.0-b13 22:28:16.705 INFO - OS: Windows XP 5.1 x86 22:28:16.721 INFO - v2.0 [a2], with Core v2.0 [a2] 22:28:17.018 INFO - RemoteWebDriver instances should connect to: http://127.0.0. 1:4444/wd/hub 22:28:17.018 INFO - Version Jetty/5.1.x 22:28:17.018 INFO - Started HttpContext[/selenium-server/driver,/selenium-server /driver] 22:28:17.033 INFO - Started HttpContext[/selenium-server,/selenium-server] 22:28:17.033 INFO - Started HttpContext[/,/] 22:28:17.127 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@1a1686 9 22:28:17.127 INFO - Started HttpContext[/wd,/wd] 22:28:17.143 INFO - Started SocketListener on 0.0.0.0:4444 22:28:17.143 INFO - Started org.openqa.jetty.jetty.Server@1c29ab2 HTML suite exception seen: java.lang.RuntimeException: sessionId 497158 doesn't exist; perhaps this session was already stopped? at org.openqa.selenium.server.FrameGroupCommandQueueSet.getQueueSet(Fram eGroupCommandQueueSet.java:220) at org.openqa.selenium.server.browserlaunchers.HTABrowserLauncher.writeS essionExtensionJs(HTABrowserLauncher.java:117) at org.openqa.selenium.server.browserlaunchers.HTABrowserLauncher.create HTAFiles(HTABrowserLauncher.java:102) at org.openqa.selenium.server.browserlaunchers.HTABrowserLauncher.launch (HTABrowserLauncher.java:63) ・・・(以下長いので省略) 解決策ご存知の方ご教授ください。 ちなみに、ポップアップブロックはしないようIEで設定済みです。 WindowsXP SP2 IEは6.0を使用しています。 よろしくお願いします。

  • Excel2021 VBAからPython制御

    VBAからPythonでブラウザの制御方法についてアドバイスをお願いします。 xlwings_udfsで以下のPython関数を呼んでブラウザを起動させた後に 更に別のPython関数でそのブラウザに対して実行掛けたいのですが ブラウザが閉じてしまいます。 @xw.func def Init(): #ドライバーインポート from selenium import webdriver from selenium.webdriver.common.by import By #ブラウザー起動 driver = webdriver.Chrome() return 0 ブラウザを閉じずに別のPython関数に継承する方法は、ないのでしょうか? 以下の様な感じです。何らかの方法でdriver変数を継承する必要があるかと思うのですがそれも上手く行きません。 msg2 = xlwings_udfs.Init() msg2 = xlwings_udfs.Proc1() msg2 = xlwings_udfs.Proc2() 色々と調べたのですが見つかりませんでした。 御存じの方が居られましたらアドバイスの程、 宜しくお願い申し上げます。

  • pythonでエクセルにコピペできない

    pythonでWebページにログインし、レポートを全選択して エクセルにペーストしたいのですが、エクセルにペーストできないです。 どのように修正したら良いのでしょうか? よろしくお願いします。 【確認したこと】 1.エクセルは更新履歴が変わっているので、開いて保存はしている。 2.プログラム終了後、手動でエクセルを開いてctrl+vするとコピーした値をペーストできる。(クリップボードにはコピーされている) 3.新規エクセルで試してもペーストできない。 import time import chromedriver_binary import pyautogui import openpyxl from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome import service wb = openpyxl.load_workbook("./BOS_Data.xlsx") #WEBブラウザの起動 driver = webdriver.Chrome() #自動ログインしたいウェブサイトのURLをコピペ driver.get('https://xxx/Login/default.asp') USER = 'o2' PASS = 'M3' my_id = driver.find_element(By.NAME, 'sUserName') password = driver.find_element(By.NAME, 'sPassword') submit_btn = driver.find_element(By.NAME, 'submit') #自動入力したIDとパスワードを入力 my_id.send_keys(USER) password.send_keys(PASS) #ログインボタンを自動入力 submit_btn.click() #Reportをクリック driver.find_element(By.XPATH, '/xxxxxxxx).click() #全選択して、コピー pyautogui.hotkey('ctrl', 'a') pyautogui.hotkey('ctrl', 'c') #すでに存在するExcelワークブックを読み込み、ペーストして保存 wb = openpyxl.load_workbook("./BOS_Data.xlsx") ws = wb['Sheet1'] wc = ws['A1'] pyautogui.hotkey('ctrl', 'v') time.sleep(3) wb.save("./BOS_Data.xlsx")

  • python スクレイピングに関して

    windows vagrant virtualbox ubuntu python3 という環境でubuntu側でdriver = webdriver.Remot('http://10.0.2.2:4444', options=options)を動かして、ホスト側のコマンドプロンプトでchromedriver --port=4444を起動していますが、selenium.common.exceptions.WebDriverException: Message: Host header or origin header is specified and is not whitelisted or localhost.というエラーが発生し、chromeが起動しません。 解決方法を教えていただけないでしょうか。

専門家に質問してみよう