复制的 XPATH 在 Selenium 中不起作用 Python

Copied XPATH doesn't work in Selenium Python

我试图抓取我学校的网站,但没有成功。我尝试了很多东西,但大多数时候我传递的 XPATH 是不正确的。 (XPATH 是从 HTML 复制的)有很多像这样的元素在单击后没有响应或者只是找不到。 我的代码:

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

def element(driver, by_x, html_element):
    try:
        element = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((by_x, html_element))
        )
        return element
    except:
        print("Element not found")

class EduPage:
    def __init__(self, name, password, edu_link):
        options = webdriver.ChromeOptions()
        options.add_experimental_option("excludeSwitches", ["enable-logging"])
        PATH = "C:\Programming Modules\Drivers\chromedriver.exe"
        self.driver = webdriver.Chrome(executable_path=PATH, options=options)
        self.name = name
        self.password = password
        self.driver.get(edu_link)

    def log_in(self):
        login_name = element(self.driver, By.ID, "login_Login_1e1")
        login_name.send_keys(self.name)
        login_pass = element(self.driver, By.ID, "login_Login_1e2")
        login_pass.send_keys(self.password, Keys.RETURN)

    def go_to_class(self):
        online_class = element(self.driver, By.XPATH, "//*[@id='jwb98b9ff6_md']/div/div[2]")
        online_class.click()


edupage = EduPage("my name", "my password", "https://gymstrop.edupage.org/login/")
edupage.log_in()
edupage.go_to_class

HTML代码(我要点击高亮元素)

失败的原因是 parent element id attributedynamic。我建议使用以下 xpath 来识别元素..

//div[@class='userTopOnlineLesson']/a

所以你的代码会像

online_class = element(self.driver, By.XPATH, "//div[@class='userTopOnlineLesson']/a")

或以下 css 选择器。

div.userTopOnlineLesson>a.userTopBlackboard

KunduK 提供的解决方案应该有效,如果无效,我也想看看您遇到的实际 selenium 错误。

同时,请尝试将等待时间增加到 60,看看这是否与等待时间长无关

try:
        element = WebDriverWait(driver, 60).until(
            EC.presence_of_element_located((by_x, html_element))
        )
        return element
    except:
        print("Element not found")