无法用硒找到元素
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 属性值。
在这种情况下,您应该针对某些具有静态属性或文本的元素编写 xpath。我觉得 span 标签中有一个文本,所以你可以在这里尝试 - //span[text()='putTheTextValue']/parent::a
在与该元素交互之前等待 5 秒,以确保在您查找该元素时已加载该元素。稍后你可以调整这个。
我正在尝试为 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 属性值。
在这种情况下,您应该针对某些具有静态属性或文本的元素编写 xpath。我觉得 span 标签中有一个文本,所以你可以在这里尝试 - //span[text()='putTheTextValue']/parent::a
在与该元素交互之前等待 5 秒,以确保在您查找该元素时已加载该元素。稍后你可以调整这个。