Селен находит только определенные элементы в Python

#python #selenium #selenium-chromedriver

Вопрос:

У меня возникли некоторые проблемы с поиском элементов с помощью Selenium в Python, он отлично работает для каждого элемента на всех других сайтах, которые я тестировал, но на игровом сайте он может найти только определенные элементы.

Вот код, который я использую:

 from selenium import webdriver
import time

driver = webdriver.Chrome("./chromedriver")
driver.get("https://www.jklm.fun")

passSelf = input("Press enter when in game...")
time.sleep(1)
syllable = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/div[2]/div").text
print(syllable)
 

При запуске кода элемент /html/body/div[2]/div[2]/div[2]/div[2]/div не найден. На изображении вы можете увидеть элемент, который он пытается найти:

Элемент, который код пытается найти

Однако, запустив тот же код, но заменив XPath чем-то за пределами основной игры (например, кодом комнаты в правом верхнем углу), он успешно находит элемент:

Вывод кода, выполняемого на другом элементе

Я пытался использовать имя класса, имя, селектор и XPath, чтобы найти исходный элемент, но нет, единственное, что, как мне кажется, влияет на это, — это то, что:

  1. Элементы периодически меняются (не уверен, влияет ли это на это)
  2. Элементы находятся в «области холста», и она каким-то образом блокирует ее.

Я не уверен, имеют ли эти вещи значение, поскольку я новичок в использовании селена, любая помощь приветствуется. Веб-сайт, на котором находится игра, является https://www.jklm.fun/ если вы хотите просмотреть элементы

Ответ №1:

Элемент, к которому вы пытаетесь получить доступ, находится внутри iframe. Сначала переключитесь на кадр, вот так

 driver.switch_to_frame(driver.find_element_by_xpath("//div[@class='game']/iframe[contains(@src,'jklm.fun')]"))
 

Комментарии:

1. Большое вам спасибо! Пытаясь найти ответ самостоятельно, я наткнулся на iframes, но был немного ошеломлен

2. Я знаю, что это действительно старый вопрос, и я не уверен, что это противоречит какому-либо правилу размещать сообщения на таком старом вопросе, но мне интересно, как вы нашли iframe? Я пытался провести некоторые исследования, но я не понимаю, как вы получили эту строку в «найти элемент по xpath».

Ответ №2:

 driver.get("https://jklm.fun/JXUS")
WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, "//button[@class='styled']"))).click()
time.sleep(10)
driver.switch_to.frame(0)
while True:
    Get_Text = driver.find_element_by_xpath("//div[@class='round']").text
    print(Get_Text)