🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2218閲覧

Ruby selenium:要素を取得してるはずだがクリックがうまく動かない

Komama

総合スコア28

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/01/04 05:57

編集2020/01/04 09:31

■分からないこと
Rubyのseleniumを使ってwebサイトの情報を取得しようとしています。
クリックしたい要素を配列で取得して、繰り返し処理で一つづづクリックしてページ遷移しようとしていますが、クリックがうまく動きません。
原因を教えていただけますと助かります。

■要素の取得
配列で取得して使いたいのは最初と偶数の要素なので、それを抽出しています。

links = driver.find_elements(:class, 'title') mail_titles = links.each_slice(2).map(&:first)

要素は取得出来ています。

(byebug) mail_titles[0] #<Selenium::WebDriver::Element:0x..fc637b858dc5e8c70 id="77be60af-108d-4eb7-a6e7-c6982fee6bc9"> (byebug) mail_titles[0].text "国内ユーザーへ 年末のあいさつ・会話の募集"

■find_elementで指定した時
こちらは問題なく動きます。

(byebug) driver.find_element(xpath: '//*[@id="row16110787"]/td[2]/span[1]/a') #<Selenium::WebDriver::Element:0x..f993245b3ebd51b4e id="f790277c-22be-44f0-a35f-e13df7d27ff1"> (byebug) driver.find_element(xpath: '//*[@id="row16110787"]/td[2]/span[1]/a').text "国内ユーザーへ 年末のあいさつ・会話の募集" (byebug) driver.find_element(xpath: '//*[@id="row16110787"]/td[2]/span[1]/a').click

■クリックの繰り返し処理

mail_titles.each do |title| begin wait.until { title.displayed? } title.click params = get_params(driver,wait) driver.navigate.back if params.nil? @stdout.fatal("params is nil") next end rescue => e @stdout.fatal(e) driver.close next end end

■コード全体

require 'csv' require 'kconv' require 'open-uri' require 'nokogiri' require 'selenium-webdriver' require 'byebug' def get_params(driver, wait) sleep 1 begin document = Nokogiri::HTML(driver.page_source, nil, 'utf-8') params = {} # 配信日 params['sent_on'] = document.xpath('//*[@id="scheduleDate"]').text # 件名 params['title'] = document.xpath('//*[@id="lblMailSentSubject"]').text # 配信数 params['sent'] = document.xpath('//*[@id="totalRecipients"]').text # 開封数 params['opened'] = document.xpath('//*[@id="totalOpens"]').text # クリック数 params['click'] = document.xpath('//*[@id="totalClicks"]').text # エラー数 params['error'] = document.xpath('//*[@id="totalBounces"]').text # 配信停止 params['unsubscribe'] = document.xpath('//*[@id="totalUnsubscribers"]').text CSV.open("#{@filename}", "a", write_headers: true) do |csv| csv << [params['sent_on'],params['title'],params['sent'],params['opened'],params['click'],params['error'],params['unsubscribe']] end rescue => e @stdout.fatal(e) driver.close end end def main() headers = ['sent_on','title','sent','opened','click','error','unsubscribe'] @title = 'benchmark' @time = Time.new.strftime("%Y_%m_%d") @filename = "#{@title}_new_#{@time}.csv" CSV.open("#{@filename}", "w", write_headers: true) {|csv| csv << headers } @stdout.info("#{@filename} is created") options = Selenium::WebDriver::Chrome::Options.new # options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,1024') wait = Selenium::WebDriver::Wait.new(timeout: 10) driver = Selenium::WebDriver.for :chrome, options: options driver.navigate.to "https://ui.benchmarkemail.com/jp/login" # ログイン情報入力後、ログインボタン押下 driver.find_element(:id, 'login').send_keys('hoge');sleep 1 driver.find_element(:id, 'password').send_keys('hoge');sleep 1 driver.find_element(:xpath, '//*[@id="login-page"]/div/div[2]/div/div[4]/fieldset[3]/div[1]/a').click;sleep 2 # レポートページに遷移 driver.find_element(:xpath, '//*[@id="sideMenu"]/div[2]/ul/li[4]/span').click;sleep 1 driver.find_element(:xpath, '//*[@id="linkEmailReports_desktop"]/a').click;sleep 1 # 各メールレポートの詳細 links = driver.find_elements(:class, 'title') mail_titles = links.each_slice(2).map(&:first) mail_titles.each do |title| begin wait.until { title.displayed? } title.click params = get_params(driver,wait) driver.navigate.back if params.nil? @stdout.fatal("params is nil") next end rescue => e @stdout.fatal(e) driver.close next end end end if __FILE__ == $0 @stdout = Logger.new(STDOUT) @stdout.info('process started') main() @stdout.info('process finished') end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

配列に テキストではなく hrefを取得して
navigateするのは 如何でしょうか?

Ruby

1def main() 2 headers = ['sent_on','title','sent','opened','click','error','unsubscribe'] 3 @title = 'benchmark' 4 @time = Time.new.strftime("%Y_%m_%d") 5 @filename = "#{@title}_new_#{@time}.csv" 6 CSV.open("#{@filename}", "w", write_headers: true) {|csv| csv << headers } 7 @stdout.info("#{@filename} is created") 8 9 options = Selenium::WebDriver::Chrome::Options.new 10 # options.add_argument('--headless') 11 options.add_argument('--no-sandbox') 12 options.add_argument('--disable-gpu') 13 options.add_argument('--window-size=1280,1024') 14 15 wait = Selenium::WebDriver::Wait.new(timeout: 10) 16 driver = Selenium::WebDriver.for :chrome, options: options 17 driver.navigate.to "https://ui.benchmarkemail.com/jp/login" 18 # ログイン情報入力後、ログインボタン押下 19 driver.find_element(:id, 'login').send_keys('manabu.goto.1@helte-corp.com');sleep 1 20 driver.find_element(:id, 'password').send_keys('Helte0322');sleep 1 21 driver.find_element(:xpath, '//*[@id="login-page"]/div/div[2]/div/div[4]/fieldset[3]/div[1]/a').click;sleep 2 22 23 # レポートページに遷移 24 driver.find_element(:xpath, '//*[@id="sideMenu"]/div[2]/ul/li[4]/span').click;sleep 1 25 driver.find_element(:xpath, '//*[@id="linkEmailReports_desktop"]/a').click;sleep 1 26 # 各メールレポートの詳細 27 links = driver.find_elements(:class, 'title') 28 mail_links = links.each_slice(2).map(&:first) 29 30 hrefs = [] 31 mail_links.each do |link| 32 hrefs.push(link.find_element(:tag_name, 'a').attribute('href')) 33 end 34 35 36 hrefs.each do |link| 37 begin 38 39 driver.navigate.to link 40 41 params = get_params(driver,wait) 42 43 if params.nil? 44 @stdout.fatal("params is nil") 45 next 46 end 47 rescue => e 48 @stdout.fatal(e) 49 driver.close 50 next 51 end 52 end 53end

投稿2020/01/04 08:16

編集2020/01/04 10:31
Reach

総合スコア735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Komama

2020/01/04 10:07

ありがとうございます! hrefで取得して無事ページ遷移出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問