Ошибка
Ошибка, которую вы получаете, выдается на финальной стадии игры, когда коробки / кнопки начинают исчезать. Как только поле исчезнет, вызов item.text
вернет None
, который не может быть преобразован в int
.
Решение
import time
from selenium.common.exceptions import StaleElementReferenceException
wave_info = [[25, "//div[contains(@style, 'opacity')]"], [50, "//div[contains(@class, 'second')]"]]
time.sleep(2)
n = 1
for wave in wave_info:
time.sleep(.1)
grid_elements = browser.find_elements_by_xpath(wave[1])
while n <= wave[0]:
for item in grid_elements:
try:
if int(item.text) == n:
item.click()
n += 1
except ValueError:
continue
except StaleElementReferenceException:
break
Объяснение
Время импортировано и time.sleep(2)
вызывается для полной загрузки времени страницы, прежде чем мы начнем с ним взаимодействовать. time.sleep(.1)
в начале l oop позволяет элементам сетки полностью загружаться между первой и второй волной (переход между первыми 25 и последними 25 элементами). Все элементы, которые мы должны щелкнуть в игре, имеют один и тот же стиль, и это используется в приведенном выше решении. Все элементы найдены и сохранены в одну строку grid_elements = browser.find_elements_by_xpath(wave[1])
. Затем элементы проходят по петле и щелкаются, когда их значение совпадает с номером, который мы ищем. Это сводит к минимуму количество кликов, которые мы фактически должны сделать, до 50 по сравнению с кликом по каждому элементу и в надежде, что вы нажали правильный. Это сравнение выполняется в попытке, за исключением случая, когда выдается ValueError
, что означает, что item.text
вернул None
. Другое, кроме завершающего внутреннего для l oop после того, как 50-й элемент был нажат. Поскольку страница изменяется и элементы перестают существовать после нажатия на 50-й элемент, при попытке щелкнуть один из этих элементов выдается StaleElementReferenceException
. Когда выдается ошибка, мы знаем, что игра окончена, потому что страница изменилась, что означает, что мы можем разбить внутреннюю часть на l oop. Два внешних цикла автоматически завершатся, потому что n
будет равен 51, а весь массив wave_info
будет закольцован. Если выдается какая-либо ошибка, код не будет остановлен.