无法用硒找到元素

Cant find element with Selenium

我正在尝试为 Etsy 店长创建一个抓取工具,但在我登录后,我无法使用代码来定位店长按钮 (NoSuchElement)。这是我的代码:

from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument('--incognito')

driverLocation = 'Downloads/chromedriver'

driver = webdriver.Chrome(driverLocation)

driver.get("https://www.etsy.com/signin")
username = driver.find_element_by_id("join_neu_email_field")
username.clear()
username.send_keys("username")

password = driver.find_element_by_id("join_neu_password_field")
password.clear()
password.send_keys("password")

driver.find_element_by_name("submit_attempt").click()

driver.implicitly_wait(10)

driver.find_element_by_class_name("wt-display-inline-flex-xs wt-flex-direction-column-xs wt-align-items-center wt-text-link-no-underline wt-p-xs-2 wt-pt-lg-0 wt-pb-lg-0 wt-pl-lg-1 wt-pr-lg-1 ge-nav-link reduced-margin-xs").click()

driver.quit()

我试图在网站上找到的按钮:

我尝试了各种不同的方法(xpath、class_name、css_selector)。我只看到 class 名称作为标识符,所以我不确定为什么它不起作用。

     driver.find_element_by_class_name("wt-display-inline-flex-xs.wt-flex-direction-column-xs.wt-align-items-center.wt-text-link-no-underline.wt-p-xs-2.wt-pt-lg-0.wt-pb-lg-0.wt-pl-lg-1.wt-pr-lg-1.ge-nav-link.reduced-margin-xs").click()

Space in class 显示它是多个 classes 你必须用点

替换 space

否则使用 xpath 或 css

   driver.find_element_by_xpath("//*[@class=\"wt-display-inline-flex-xs wt-flex-direction-column-xs wt-align-items-center wt-text-link-no-underline wt-p-xs-2 wt-pt-lg-0 wt-pb-lg-0 wt-pl-lg-1 wt-pr-lg-1 ge-nav-link reduced-margin-xs\"]").click()



   driver.find_element_by_cssSelector("[class=\"wt-display-inline-flex-xs wt-flex-direction-column-xs wt-align-items-center wt-text-link-no-underline wt-p-xs-2 wt-pt-lg-0 wt-pb-lg-0 wt-pl-lg-1 wt-pr-lg-1 ge-nav-link reduced-margin-xs\"]").click()

这将 select 具有精确值

属性 class 的元素

<a> 元素有一个子元素 <span>。因此,要单击该元素,您可以使用以下任一方法 :

  • 使用css_selector:

    driver.find_element_by_css_selector("a[href^='https://www.etsy.com/your/shops/me/dashboard'] > span").click()
    
  • 使用xpath:

    driver.find_element_by_xpath("//button[@class='save' and text()='save']").click()
    

理想情况下,要单击您需要为 element_to_be_clickable() 引入 WebDriverWait 的元素,您可以使用以下任一方法 :

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href^='https://www.etsy.com/your/shops/me/dashboard'] > span"))).click()
    
  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[starts-with(@href, 'https://www.etsy.com/your/shops/me/dashboard')]/span"))).click()
    
  • 注意:您必须添加以下导入:

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

您不应在此处使用 class 名称,因为此 class 看起来非常动态。 也不建议在 xpath 中使用 href 属性值。

  1. 在这种情况下,您应该针对某些具有静态属性或文本的元素编写 xpath。我觉得 span 标签中有一个文本,所以你可以在这里尝试 - //span[text()='putTheTextValue']/parent::a

  2. 在与该元素交互之前等待 5 秒,以确保在您查找该元素时已加载该元素。稍后你可以调整这个。