Я пытаюсь написать программу, которая работает так:
- Перейти на главную страницу
- Щелкните по первому элементу в списке (все элементы начинаются с «item-»), и я попаду на следующую страницу.
- Найдите кнопку с надписью "A" и нажмите ее.
- Найдите кнопку «Подтвердить» и нажмите ее.
- Вернитесь назад и к тому же для пункта 2, пункта 3 и т. Д.
У меня две проблемы. Во-первых, кнопка с буквой «А» иногда имеет больше текста, чем просто буква «А», например. "A" со сноской "123". Я не знаю много о HTML, но это приводит к различным классам span и div:
<div class="selectOne">
<span class="selectObject-no-footnote">A</span>
</div>
<div class="selectOne-with-footnote">
<span class="selectObject">A</span>
<span class="selectFootnote">
<span>123</span>
</span>
</div>
Они никогда не находятся на одной странице, но с моим решением кнопка "A" не всегда нажимается. Трудно сказать, если это потому, что мое решение не является правильным или оно приходит от второй проблемы. Часто (это случайно), когда я захожу на страницу с кнопками, какой-то баннер скатывается с верха страницы, и весь сайт смещается так, что моя кнопка «Подтвердить» не видна. Я решил, что просто прокручиваю сайт вниз каждый раз и только потом начинаю искать кнопки. Тогда не имеет значения, скатывается баннер или нет, потому что в обоих случаях видны кнопки «А» и «Подтверждение». Но все же у меня нет 100% точности, и иногда я получаю исключение click intercepted
. Мой код:
i=0
a=1
while True:
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[starts-with(@id, 'item-')]")))
items = driver.find_elements_by_xpath("//*[starts-with(@id, 'item-')]")
try:
items[i].click()
try:
try:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='selectObject-no-footnote'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject-no-footnote'][contains(text(),'A')]").click()
except Exception as e:
a = 0
print(e)
if a==0:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='selectObject'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject'][contains(text(),'A')]").click()
a=1
WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.ID, 'confirm')))
driver.find_element_by_id('confirm').click()
except Exception as e:
print(e)
i += 1
driver.back()
except IndexError:
print(items)
print(i)
break
Есть ли другой инструмент, который мог бы делать это, не беспокоясь о том, что элементы покрыты чем-то или находятся вне окна? (Scrappy?)