我遇到了一個奇怪的錯誤,我不知道如何解決。我正在嘗試制作一個使用 Ruby 和 Selenium 在瀏覽器中解決 Wordle 的程式。我注意到,從第二次猜測開始,程式只會繼續猜測同一個單詞,而不是結合反饋并獲取一個新單詞。所以我添加了一個 byebug 陳述句來看看發生了什么,然后它開始作業了。如果我洗掉 byebug 陳述句,錯誤會再次出現。我簡直不敢相信,所以我推到 Github 并克隆到另一臺計算機上,同樣的事情又發生了。基本上,只要我在第 24 行之后的任何位置放置一個 byebug 陳述句,代碼就會按預期作業。這是代碼。
require 'webdrivers'
require './words.rb'
require 'byebug'
class WordleSolver
attr_reader :driver
def initialize
options = Selenium::WebDriver::Options.chrome
@driver = Selenium::WebDriver.for :chrome, options: options
@driver.manage.timeouts.implicit_wait = 10
@driver.get 'https://www.nytimes.com/games/wordle/index.html'
@game_div = driver.find_element(css: 'game-app').shadow_root.find_element(css: 'div#game')
@words = PossibleWords::WORDS
@word = ['', '', '', '', '']
@present = {}
@absent = []
@current_row = 1
end
def solve
close_modal
guess('store')
5.times do
get_feedback
break if game_won?
next_guess = formulate_guess
guess(next_guess)
sleep(3)
end
end
def game_won?
@word.each { |letter| return false if letter == '' }
true
end
def close_modal
@game_div.find_element(css: 'game-modal').shadow_root.find_element(css: 'div.close-icon').click
end
def guess(word)
@driver.action.send_keys(word).send_keys(:enter).perform
end
def formulate_guess
@words.each do |word|
return word if valid_guess?(word)
end
'guess'
end
def valid_guess?(word)
@word.each_with_index do |letter, index|
if letter != ''
return false if word[index] != letter
end
end
@absent.each do |letter|
return false if word.include?(letter)
end
@present.each do |letter, incorrect_positions|
return false if !word.include?(letter)
incorrect_positions.each do |position|
return false if word[position] == letter
end
end
end
def get_feedback
row = @game_div.find_element(css: "game-row:nth-of-type(#{@current_row})").shadow_root
1.upto(5) do |n|
tile = row.find_element(css: "game-tile:nth-of-type(#{n})")
letter = tile.attribute("letter")
evaluation = tile.attribute("evaluation")
add_feedback(letter, evaluation, n - 1)
end
@current_row = 1
end
def add_feedback(letter, evaluation, position)
case evaluation
when 'absent'
@absent.push(letter)
when 'present'
if @present[letter]
@present[letter].push(position)
else
@present[letter] = [position]
end
when 'correct'
@present.delete(letter)
@word[position] = letter if @word[position] == ''
end
end
end
begin
solver = WordleSolver.new
solver.solve
sleep(5)
ensure
solver.driver.quit
end
TLDR 當我在代碼中添加 byebug 陳述句時,我正在調查的錯誤消失了
uj5u.com熱心網友回復:
BroiSatse 的評論解決了我的問題。通過添加一個 byebug 陳述句,我還導致程式等待,讓它有時間與瀏覽器同步,從而修復了這個錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/440714.html
下一篇:當我嘗試使用twilio-rubygem“警告:LoadError:cannotloadsuchfile--rack/media_type”時出現以下錯誤
