NoSuchElementException: сообщение: такого элемента нет: невозможно найти ошибку элемента при очистке верхнего 20 держателя с использованием Selenium и Python - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь очистить верхний 20 держателей жетона на цепочке ER C -20. Я использую для этого селен. Похоже, что xpath не загружается / не было достаточно времени?

Я пытаюсь загрузить эту страницу: https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances

Я пробовал с неявным ожиданием и с явным Подождите. Я даже вижу, когда запускаю webdriver, что сторона загружена, но он так и не нашел путь ...

Код с явным ожиданием:

options = Options()
ptions.add_argument("--disable-dev-shm-using")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances")
wait = WebDriverWait(driver, 10, poll_frequency=1)
wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="maintable"]/div[3]/table/tbody/')))

Ошибка:

selenium.common.exceptions.TimeoutException: Message:

Да даже сообщения ...

Код с неявным:

options = Options()
ptions.add_argument("--disable-dev-shm-using")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(chrome_options=options)
driver.implicitly_wait(10)
driver.get("https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances")
for i in range(1,20):
            req = driver.find_element_by_xpath('//*[@id="maintable"]/div[3]/table/tbody/tr['+str(i)+']/td[2]/span/a')
            

Ошибка:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="maintable"]/div[3]/table/tbody/tr[1]/td[2]/span/a"}

Так как я сказал, это выглядит например, у драйвера недостаточно времени для загрузки страницы, но даже с 20,30, ... secounds они не находят путь.

Также, когда я копирую xpath из браузера, открытого скриптом, я могу найти xpath.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Чтобы очистить верхние 20 держателей токена в цепочке ER C -20, поскольку информация Держатели находится внутри <iframe>, вам необходимо:

  • scrollIntoView Таблица держателей токенов

  • Вызвать WebDriverWait , чтобы желаемый фрейм был доступен, и переключиться на it .

  • Induce WebDriverWait для желаемого visibility_of_all_elements_located().

  • Вы можете использовать следующие стратегии Locator :

    driver.get("https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances")
    driver.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='card']"))))
    WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='tokeholdersiframe']")))
    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-md-text-normal table-hover']//tbody//tr//td[./span]/span/a")))[:20]])
    
  • Примечание : вам необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Вывод в консоль:

    ['0x7b8c69a0f660cd43ef67948976daae77bc6a019b', 'Binance 7', '0x5754284f345afc66a98fbb0a0afe71e0f007b949', 'Binance', 'Huobi 9', 'Bittrex 3', '0xd545f6eaf71b8e54af1f02dafba6c0d46c491cc1', '0x778476d4c51f93078d61e51c978f90b4a6e500af', 'Bitfinex 2', '0x5041ed759dd4afc3a72b8192c143f72f4724081a', '0xd30b438df65f4f788563b2b3611bd6059bff4ad9', '0x570aeda18a21d8fff6d28a5ef34164553cf9cb77', '0x2b9dc5aaf7b1c15f1fd8aba255919c2a7a184453', '0x6a5b1111a0b5ea8c7ec5665ba09cbacd7fde2b96', 'Gate.io 1', '0x9ec7d40d627ec59981446a6e5acb33d51afcaf8a', '0x231568baa78111377f097bb087241f8379fa18f4', '0xd33547964bae70e1ddd2863a4770dc5cffd86269', 'Huobi 3', 'Compound Tether']
    
0 голосов
/ 13 июля 2020

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

Вызвать WebDriverWait () и дождаться frame_to_be_available_and_switch_to_it ()

Вызвать WebDriverWait () и дождаться visibility_of_all_elements_located ()

кода :

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.get("https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances")
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"tokeholdersiframe")))
elements=WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.XPATH,'//*[@id="maintable"]/div[3]/table/tbody//tr/td[2]//a')))
for ele in elements:
    print(ele.get_attribute('href'))

Если вы хотите получить первые 20 токенов , используйте это.

for ele in elements[:20]:
    print(ele.get_attribute('href'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...