无法获取selenium中元素和类的大小

2024-10-05 13:16:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图读取所有名为shadow class non mb-3的元素,并多次迭代以提取readHeading和readCollapse。但是第一个代码返回零,因此循环不运行。它也找不到readHeading和readCollapse。我尝试了xpath和按名称搜索

麦可德

values="/0"
ga=pandas.read_csv("contracts/adresses.csv")
for i in range (ga.size-1):
        fj=ga.iloc[i][0]
        # driver.get("https://etherscan.io/address/"+str(fj))
        break
        

time.sleep(5)
      
driver.get("https://etherscan.io/address/"+str(fj)+"#readContract")

wait = WebDriverWait(driver,30)

frame = wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"readcontractiframe")))

expandall = wait.until(EC.element_to_be_clickable((By.XPATH,"//a[@onclick='expandCollapseAll()']")))
expandall.click()
time.sleep(10)
a=[]
va=[]
sik = driver.find_element((By.XPATH,"//*[@id='readContractAccordion']"))


print(sik)

for i in sik:
        try:
            print(driver.find_element((By.CLASS_NAME, "readHeading"+str(i))))
            print(driver.find_element(By.CLASS_NAME, "readCollapse" +str(i)))
            print(i)
        except:
            print("Elements finished")
            break

The link
HTML

<div class="card shadow-none mb-3">
        <div class="card-header bg-light card-collapse p-0" id="readHeading1">
        <a class="btn btn-link btn-block text-dark d-flex justify-content-between align-items-center py-2" data-toggle="collapse" href="#readCollapse1" aria-expanded="true" aria-controls="readCollapse1">
        1. name 
    <span class="accordion-arrow">
        <i class="fas fa-arrow-down small"></i>
        </span>
        </a>
        </div><div id="readCollapse1" class="readContractFunction collapse show" aria-labelledby="readHeading1" style="">
        <div class="card-body p-3"><form>
        <div class="form-group">BNB <i>
        <span class="text-monospace text-secondary">string</span></i></div></form></div></div></div>

更新: Error furas

页码:https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#readContract


Tags: httpsdivbydriverelementcardclassspan
1条回答
网友
1楼 · 发布于 2024-10-05 13:16:39

我发现了一些错误和问题:

  • 值位于<iframe>中,Selenium将其视为单独的页面,需要driver.switch_to.frame(...)才能访问值

  • 使用By.CLASS_NAME获取readHeadingreadHeading,但必须使用By.ID

  • 我不明白你试图用sik做什么,因为你用find_element(末尾没有s)来得到sik,所以它只给出一个元素,但后来你试着用for循环,你希望得到readHeadingreadHeading的数字。我假设所有标记在页面上都有9个元素,我使用了for i in range(1, 9):


最小工作代码

它可能需要一些更改-例如,它可以使用WebDriverWait而不是sleep-但是现在它可以工作了

from selenium import webdriver
#from selenium.webdriver.support.ui import WebDriverWait
#from selenium.webdriver.support import expected_conditions as EC
import time

url = 'https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#readContract'

#driver = webdriver.Chrome()
driver = webdriver.Firefox()
driver.get(url)

time.sleep(5)  # JavaScript needs time to add elements on page

frame = driver.find_element_by_id('readcontractiframe')
driver.switch_to.frame(frame)

driver.find_element_by_xpath('//a[text()="[Expand all]"]').click()
time.sleep(0.5)  # JavaScript needs time to expand all

for i in range(1, 9):
    print(' -', i, ' -')
    print(driver.find_element_by_id(f"readHeading{i}").text)
    print(driver.find_element_by_id(f"readCollapse{i}").text)

结果:

 - 1  -
1. name
BNB string
 - 2  -
2. totalSupply
16579517055253348798759097 uint256
 - 3  -
3. decimals
18 uint8
 - 4  -
4. balanceOf
<input> (address)
Query
uint256
 - 5  -
5. owner
0x00c5e04176d95a286fcce0e68c683ca0bfec8454 address
 - 6  -
6. symbol
BNB string
 - 7  -
7. freezeOf
<input> (address)
Query
uint256
 - 8  -
8. allowance
<input> (address)
<input> (address)
Query
uint256

相关问题 更多 >

    热门问题