繁体   English   中英

Python Selenium 在网页上找不到任何元素

[英]Python Selenium can't find any element on a webpage

我想用 selenium 自动化一个简单的任务。 登录此网站: https : //www.lernsax.de/ 我正在尝试通过 xpath 定位元素,但这根本不起作用,我得到了一个NoSuchElementException 我正在使用 Chromedriver,并且尝试使用不同的定位方法,例如

find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name

但我总是收到这个错误。 我已经尝试过不同的网站,它在 xpath 上运行良好。

任何帮助都意味着很多!

这是我的完整代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome(executable_path="C:\chromedriver\chromedriver.exe")
driver.get("https://lernsax.de")
loginbtn = driver.find_element_by_xpath('//*[@id="skeleton_main"]/div[1]/div[2]/div/a')
loginbtn.click()
time.sleep(2)
driver.quit()

以及完整的错误消息:

    Traceback (most recent call last):
  File "C:/Users/.../lernsax.py", line 6, in <module>
    loginbtn = driver.find_element_by_xpath('//*[@id="skeleton_main"]/div[1]/div[2]/div/a')
  File "C:\Users\...\PycharmProjects\LernsaxAutomation\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\...\PycharmProjects\LernsaxAutomation\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\...\PycharmProjects\LernsaxAutomation\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\...\PycharmProjects\LernsaxAutomation\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="skeleton_main"]/div[1]/div[2]/div/a"}
  (Session info: chrome=80.0.3987.149)

页面上存在iframe ,因此您需要先将驱动程序切换到 iframe 并对元素进行操作:

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


driver = webdriver.Chrome()
driver.get("https://lernsax.de")
# Switch to iframe
driver.switch_to.frame(driver.find_element_by_id('main_frame'))
# Find the element by applying explicit wait on it and then click on it
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@id='skeleton_main']/div[1]/div[2]/div/a"))).click()

看起来登录表单包含在 iframe 中,您需要切换到该 iframe 并执行您需要的操作。 在单击登录按钮之前添加以下内容。

driver.switch_to.frame('main_frame')

由于所需元素位于<iframe>因此要在元素上调用click() ,您必须:

  • Induce WebDriverWait以获得所需的frame_to_be_available_and_switch_to_it()
  • 为所需的element_to_be_clickable()引入WebDriverWait
  • 您可以使用以下任一定位器策略

    • 使用CSS_SELECTOR

       driver.get('https://www.lernsax.de/wws/9.php#/wws/101505.php?sid=97608267430324706358471707170230S5c89c6aa') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#content-frame"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-qa='reporting-filter-trigger-toggle'][data-ember-action]"))).click()
    • 使用XPATH

       driver.get('https://www.lernsax.de/wws/9.php#/wws/101505.php?sid=97608267430324706358471707170230S5c89c6aa') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='main_frame']"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='mo' and text()='Login']"))).click()
    • 注意:您必须添加以下导入:

       from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
  • 浏览器快照:

学习萨克斯


参考

您可以在以下位置找到一些相关讨论:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM