錯誤當試圖執行,這是一個屏幕刮板我一直在使用水豚和硒web驅動程序工作。這是確切的錯誤:給定的選擇器#無效或不會導致WebElement。發生以下錯誤:(Selenium :: WebDriver :: Error :: InvalidSelectorError)。這與選擇器應該找到下一頁鏈接並點擊它有關。檢查來源時,它是一個有效的xpath選擇器,但水豚和硒不同意。Selenium :: WebDriver :: Error :: InvalidSelectorError當找到XPath選擇器的下一頁鏈接
require "capybara/dsl"
require "spreadsheet"
require "fileutils"
require "open-uri"
Capybara.run_server = false
Capybara.default_driver = :selenium
Capybara.default_selector = :xpath
Spreadsheet.client_encoding = 'UTF-8'
class Tomtop
include Capybara::DSL
def initialize
@LOCAL_DIR = "data-hold/images"
@excel = Spreadsheet::Workbook.new
@work_list = @excel.create_worksheet
@row = 0
FileUtils.makedirs(@LOCAL_DIR) unless File.exists? @LOCAL_DIR
end
def go
visit_main_link
end
def retryable(options = {}, &block)
opts = { :tries => 1, :on => Exception }.merge(options) #possible bug (remove this line and take options from options hash)
retry_exception, retries = opts[:on], opts[:tries]
begin
return yield
rescue retry_exception
retry if (retries -= 1) > 0
end
yield
end
def visit_main_link
visit "http://www.example.com/clothing-accessories?dir=asc&limit=72&order=position"
@results = all("//h5/a[contains(@onclick, 'analyticsLog')]")
while page.has_selector?("//td[contains(@class, 'pages')]//a[img/@alt='Next Page']")
retryable(:tries => 1, :on => OpenURI::HTTPError) do
find.first("//td[contains(@class, 'pages')]//a[img/@alt='Next Page']").click
@results = all("//h5/a[contains(@onclick, 'analyticsLog')]")
@results.each do |a|
@links << a[:href]
end
@links.each do |link|
visit link
save_item
end
@excel.write "inventory.csv"
end
end
end
def save_item
data = all("//*[@id='content-wrapper']/div[2]/div/div")
data.each do |info|
@work_list[@row, 0] = info.find("//*[@id='productright']/div/div[1]/h1").text
price = info.first("//div[contains(@class, 'price font left')]")
@work_list[@row, 1] = (price.text.to_f * 1.33).round(2) if price
@work_list[@row, 2] = info.find("//*[@id='productright']/div/div[11]").text
@work_list[@row, 3] = info.find("//*[@id='tabcontent1']/div/div").text.strip
color = info.all("//dd[1]//select[contains(@name, 'options')]//*[@price='0']")
@work_list[@row, 4] = color.collect(&:text).join(', ')
size = info.all("//dd[2]//select[contains(@name, 'options')]//*[@price='0']")
@work_list[@row, 5] = size.collect(&:text).join(', ')
sku = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href'])
@work_list[@row, 6] = sku.gsub!(/\D/, "")#.join(([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(4).join)
@work_list[@row, 7] = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href'])
imagelink = info.all("//*[@rel='lightbox[rotation]']")
@work_list[@row, 8] = imagelink.map { |link| File.basename(link['href']) }.join(', ')
images = imagelink.map { |link| link['href'] }
images.each do |image|
File.open(File.basename("#{@LOCAL_DIR}/#{image}"), 'w') do |f|
f.write(open(image).read)
end
end
@row = @row + 1
end
end
end
tomtop = Tomtop.new
tomtop.go
這是什麼故障? – Arran
第46行似乎是問題,但上面幾行使用相同的xpath選擇器評估罰款:page.has_selector?(「// td [contains(@class,'pages')] // a [img/@ alt = 'Next Page']「) – jcuwaz
你跑什麼瀏覽器? – Arran