【问题标题】:Can't locate element by XPath, id, class name... nothing is working无法通过 XPath、id、类名定位元素...没有任何工作
【发布时间】:2021-11-05 16:18:00
【问题描述】:
url = 'https://etherscan.io/token/0x7ae1d57b58fa6411f32948314badd83583ee0e8c#readContract'
browser = webdriver.Chrome('C:\webdrivers\chromedriver')

headers1 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}

# wait = WebDriverWait(browser, 10)
browser.get(url)
time.sleep(10)

btn6 = browser.find_element_by_xpath('//*[@id="readHeading6"]/a') # error
btn6.click()    

StackOverflow 不允许我发布图片,所以我复制了下面的元素。

<a class="btn btn-link btn-block text-dark d-flex justify-content-between align-items-center py-2 collapsed" data-toggle="collapse" href="#readCollapse6" aria-expanded="false" aria-controls="readCollapse6">6. claimedByTokenId <span class="accordion-arrow"><i class="fas fa-arrow-down small"></i></span></a>

此外,我使用的每个 XPath 帮助程序都无法识别我要查找的按钮。我尝试通过 CSS 选择器、类名、id、XPath、完整 Xpath 查找。上面代码中的 XPath 来自 chrome。检查元素 > 复制 > xpath。

我对编程还很陌生,因此非常感谢任何帮助!谢谢。

【问题讨论】:

  • 检查答案并✓(接受)如果一切正常。我已经在我的系统上对其进行了测试,它可以工作。
  • 根据这篇文章,meta.stackexchange.com/questions/75491/… 可以通过链接上传您的图片吗?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python selenium selenium-webdriver web-scraping xpath


【解决方案1】:

您的 XPath 是正确的,但您缺少一些重要的东西。主要是iframe。因此,您的任务的正确步骤是:

1 点击“知道”以接受 cookie。

2 切换到 iframe,因为您的按钮位于 iframe 内。

3 导入 WebDriverWait 以显式等待您的元素,而不是 time.sleep

您的按钮将被点击。

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


url = 'https://etherscan.io/token/0x7ae1d57b58fa6411f32948314badd83583ee0e8c#readContract'
browser = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')

headers1 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}

browser.get(url)
wait = WebDriverWait(browser, 10)
coockie_btn = wait.until(EC.element_to_be_clickable((By.ID, 'btnCookie'))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "readcontractiframe")))
btn6 = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="readHeading6"]/a'))).click()

【讨论】:

    【解决方案2】:

    首先,它可能需要接受 cookie,这就是为什么您可以尝试点击“知道”按钮,如下所示:

    btn6 = browser.find_element_by_xpath('//*[@id="btnCookie"]') # error
    btn6.click()
    time.sleep(1.5)
    

    【讨论】:

    • 只解决了一部分问题,但思路是对的。
    【解决方案3】:

    所以看起来 readHeading6 实际上并不是您尝试单击的按钮。

    如果您在检查中下拉该 div,看起来您要点击的 xPath 实际上是

    /html/body/div[3]/div[6]/div[1]/a

    如果您只需输入一个 uint64 并确定它是否被声明(如果我正确理解该网站),我相信您可以忽略实际下拉该菜单并可能直接进行进入。

    顺便说一句,如果你想看看它是否被声明,你会想要阅读控制台输出,here's some help

    根据您要执行的操作,您实际上并不需要单击该按钮。我不知道 Chrome,但 Firefox 有办法打开“无头”模式,所以唯一的输出是在终端中。

    我已经有一段时间没有这样做了,但它应该类似于

    options = webdriver.FirefoxOptions()
    options.set_headless()
    browser = webdriver.Firefox(firefox_options = options)
    

    可能帮助不大,但无论如何都值得添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多