【问题标题】:Unable to locate an element using selenium python无法使用 selenium python 定位元素
【发布时间】:2021-05-11 18:18:51
【问题描述】:

对不起,如果我的问题格式错误,因为我是编程和 StackOverFlow 的新手。我无法使用类或任何其他方法找到下载按钮。目前正在尝试使用 xpath 解决,但我听说 xpath 不是可靠的方法。我正在尝试抓取 wikiloc 站点以下载特定位置内的所有轨道路径。登录的问题可能是我在抓取时可能没有登录。顺便说一句,我主要使用谷歌 colab。我的代码如下:

driver.get('https://www.wikiloc.com/wikiloc/start.do')
driver.find_element_by_name('email').send_keys('testacount852')
driver.find_element_by_name('password').send_keys('49Vchu4njDrrT7.')
driver.find_element_by_id('submit-button').click()
time.sleep(10)
driver.get("https://www.wikiloc.com/trails/outdoor/france/brittany")
links = []
temp_links = []
names = []
temp_names = []
for _ in range(4):
  temp = driver.find_elements_by_css_selector('a.trail-title.dont-break-out')
  temp_links = [x.get_attribute('href') for x in temp]
  temp_names = [x.text for x in temp]
  links = links+temp_links
  names = names+temp_names
  try:
    driver.find_element_by_class_name('next').click()
    time.sleep(2)
  except:
    break
for link in links:
  driver.get(link)
  driver.find_element_by_id('download-button').click()
  time.sleep(4)
  driver.find_element_by_class_name('active').click()
  time.sleep(4)
  driver.find_element_by_xpath("/html/body/main/div/div[2]/div/div[1]/div/div[2]/div/div[2]/form/div[2]/input").click()
  time.sleep(4)

df['Names'] = pd.Series(names)
df['Links'] = pd.Series(links)
df.to_csv('test1.csv')
driver.close()

这是我的凭据的链接 [1]:https://i.stack.imgur.com/HZ6bZ.png

【问题讨论】:

  • 哪个元素不起作用,那么长的 xpath?为了找到一个好的选择器,我们需要被测页面的完整 HTML。我尝试按照您的测试步骤访问该页面,但无法登录。
  • 是的!长 xpath 。这就是我认为可能登录不起作用所以下载按钮不出现。有没有办法让我的登录正常工作
  • 好吧,您需要一个有效的用户名和密码,而这些似乎不是。我认为这里没有人可以帮助您。
  • 凭据正确。我自己检查过它们,但无头浏览器似乎无法正确登录。我试过没有无头,它似乎把凭据然后打开指定的链接。作为测试,我在那里停止了我的脚本并检查我是否已登录,我发现我没有被浏览器登录。我在 facebook 上使用的方法相同(当然还有其他凭据),但完全没有问题。

标签: python selenium screen-scraping


【解决方案1】:

在 youtube 上有一个非常好的教程(这个人教使用这个非常有趣的 cookie clicker 游戏);它具有 try/except 我在下面这是我访问硒项目的 goto。我能够使用下面显示的代码使其工作,希望这会有所帮助...

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


driver = webdriver.Chrome()

driver.get('https://www.wikiloc.com/wikiloc/start.do')
driver.find_element_by_name('email').send_keys('testacount852')
driver.find_element_by_name('password').send_keys('49Vchu4njDrrT7.')
driver.find_element_by_id('submit-button').click()
time.sleep(10)
driver.get("https://www.wikiloc.com/trails/outdoor/france/brittany")
links = []
temp_links = []
names = []
temp_names = []
for _ in range(4):
  temp = driver.find_elements_by_css_selector('a.trail-title.dont-break-out')
  temp_links = [x.get_attribute('href') for x in temp]
  temp_names = [x.text for x in temp]
  links = links+temp_links
  names = names+temp_names
  try:
    driver.find_element_by_class_name('next').click()
    time.sleep(2)
  except:
    break
for link in links:
    driver.get(link)
    try:
        downloadbutton = WebDriverWait(driver,15).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#download-button")))
        downloadbutton.click()
    except:
        print("Couldn't find the download button")
        pass
    time.sleep(4)
    driver.find_element_by_class_name('active').click()
    time.sleep(4)
    driver.find_element_by_xpath("/html/body/main/div/div[2]/div/div[1]/div/div[2]/div/div[2]/form/div[2]/input").click()
    time.sleep(4)

df['Names'] = pd.Series(names)
df['Links'] = pd.Series(links)
df.to_csv('test1.csv')
driver.close()

【讨论】:

  • 我说的是长 xpath。 selenium 似乎没有找到它
  • NoSuchElementException: 消息:没有这样的元素:无法找到元素:{"method":"xpath","selector":"/html/body/main/div/div[2]/div /div[1]/div/div[2]/div/div[2]/form/div[2]/input"}(会话信息:headless chrome=90.0.4430.93)
  • 我明白了....不幸的是,我(压力)无法做到这一点,因为我遇到了 a)谷歌验证码和 b)无效的用户/通行证。
【解决方案2】:

好的,我发现了问题。是验证码打破了它。我无法登录,并且在我登录之前下载按钮 (xpath) 将不可用。感谢大家特别帮助我@ShawnRamirez 指出验证码。

【讨论】:

    【解决方案3】:

    2 个问题:

    1. 点击下载按钮后,没有类名为'active'的webelement?

    2. 你想通过这个 xpath 找到什么以及在哪个页面 '/html/body/main/div/div[2]/div/div[1]/div/div[2]/div/div[2 ]/form/div[2]/输入'? ==========================================

    更新:

    driver.find_element_by_xpath(".//li/a[text() ='File']").click()
    driver.find_element_by_xpath(".//input[@id='btn-download-file']").click()
    

    【讨论】:

    • 1.检测到第一个按 id ('download-button') 的下载按钮,它将我们重定向到另一个页面,它要求我们选择下载方法。第二个按钮(“活动”)也被检测到,它打开了一个菜单,真正的下载按钮(xpath)应该是但未被检测到
    • 第二个按钮只有在你点击后才会变成活动类。所以它不是试图找到元素的正确方法。更新了我之前的评论。
    • 谢谢!!!绕过验证码后我会记住这一点。
    • 不是点击,而是点击()
    【解决方案4】:

    我使用 cookie 而不是提供凭据绕过了登录问题:

    所以而不是提供

    driver.find_element_by_name('email').send_keys('testacount852')
    driver.find_element_by_name('password').send_keys('49Vchu4njDrrT7.')
    driver.find_element_by_id('submit-button').click()
    

    我绕过登录:

    driver.get('https://www.wikiloc.com/wikiloc/start.do')
    driver.add_cookie({"name": "SESSION", "value": "##############"})
    
    driver.add_cookie({"name": "wluseruuid", "value": "****************"})
    driver.add_cookie({"name": "_wlutm", "value": "********************"})
    driver.add_cookie({"name": "wikiloc_cookie_consent", "value": "**********"})
    driver.add_cookie({"name": "JforumSSO", "value": "************"})
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多