■分からないこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/04 10:07