【问题标题】:cannot locate element within a web page using selenium python无法使用 selenium python 在网页中定位元素
【发布时间】:2016-06-02 19:11:02
【问题描述】:

我只想为一个网站编写一个简单的登录代码。但是,我认为登录页面是用 JS 编写的。用硒定位元素真的很难。 我要玩的网页是: "https://www.nike.com/snkrs/login?returnUrl=%2F"

这是页面的外观以及检查元素页面的外观:

我试图通过以下代码定位元素:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys
import time 
driver = webdriver.Firefox()
driver.get("https://www.nike.com/snkrs/login?returnUrl=%2Fthread%2Fe9680e08e7e3cd76b8832684037a58a369cad5ed")
time.sleep(5)
driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) 
elem =driver.find_element_by_xpath("//*[@id='ce3feab5-6156-441a-970e-23544473a623']") 
elem.send_keys("pycon") 
elem.send_keys(Keys.RETURN) 
driver.close()

此代码返回 [@id='ce3feab5-6156-441a-970e-23544473a623' 找不到元素的错误。

我试过玩框架,它似乎不起作用。如果我去“查看网页源代码”页面,它充满了 JS 代码。

有没有什么好的方法可以用 selenium 来玩这样一个网页?

【问题讨论】:

  • 很抱歉我的代码格式不正确。
  • 如果您知道您的代码格式不正确,为什么不修复它? ;)
  • WOWOWOWOW,你是怎么做到的,我试过了,我以为我发布后我不能修改它......我需要学习如何使用这个网站。感谢您的帮助。

标签: python selenium


【解决方案1】:

尝试更改代码:

elem =driver.find_element_by_xpath("//*[@id='ce3feab5-6156-441a-970e-23544473a623']") 

elem =driver.find_element_by_xpath("//*[@type='email']") 

【讨论】:

  • 有效!!太谢谢了!!我是这里的新手,很高兴能解答困扰我一周的问题...
  • 嗨,老兄,我遇到了一个新问题。使用上面相同的链接,单击“立即加入”将进入注册页面。有一个元素名为“出生日期”。实际上,我能够找到元素,但是,我不能使用 element.send_keys("12081922") 来填充该行。代码没有错误,只是未能正确填写表格。我也试了先element.click(),然后element.send_keys("12081922"),没有报错,但是填表失败。
  • @Luke - 请您在另一个线程中启动它,这样会更好理解。似乎无论如何它都不依赖于此。
  • 好的,麻烦你看看我的另一个问题:stackoverflow.com/questions/37705631/…
【解决方案2】:

我的猜测(和观察)是每次访问页面时 id 都会发生变化。 id 看起来是自动生成的,当我多次访问该页面时,id 每次都不一样。

您需要搜索不变的内容。例如,您可以搜索name 属性,该属性具有看似静态的值“emailAddress”

element = driver.find_element_by_name("emailAddress")

您还可以使用 xpath 表达式来搜索其他属性,例如 data-componentname

element = driver.find_element_by_xpath("//input[@data-componentname='emailAddress']")

此外,您可以简单地等待元素可见,而不是硬编码睡眠:

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.Firefox()
driver.get("https://www.nike.com/snkrs/login")

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.NAME, "emailAddress"))
)

【讨论】:

  • 嗨,布莱恩,我遇到了一个新问题。使用上面相同的链接,单击“立即加入”将进入注册页面。有一个元素名为“出生日期”。实际上,我能够找到元素,但是,我不能使用 element.send_keys("12081922") 来填充该行。代码没有错误,只是未能正确填写表格。我也试了先element.click(),然后element.send_keys("12081922"),没有报错,但是填表失败。
猜你喜欢
  • 2015-12-14
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多