Selenium ChromeDriver:找不到我知道存在的web元素



使用python和Selenium,我无法抓取本网站上任何插入JavaScript的数据。我在其他网站上用动态生成的内容测试了我的代码,它似乎很有效,所以我想知道这是否是JS在这个网站上生成的特定方式?

我想在网站上查一下这个商品的库存情况。下面的代码生成以下异常:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id="theList"]/article[1]//div[@class="order"]/div/text()"},但我知道这个xpath是在chrome-dev工具中尝试的。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
elem = driver.find_element(
By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]')
print(elem.text)

阅读相关的SO帖子,我想可能是我需要手动告诉驱动程序等待页面加载,所以我尝试了这个:

service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
try:
elem = WebDriverWait(driver=driver, timeout=20).until(
lambda x: x.find_element(By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]'))
print(elem.text)
except TimeoutException:
print('took too long')

但它总是超时,并返回我的异常消息。

有什么想法为什么这可能不起作用吗?正如我所说,由于某种原因,我可以从其他网站获得JS生成的代码,但不能从deejay.de获得

您需要先切换到iframe。

iframe = WebDriverWait(driver, 30).until(EC.presence_of_element_located(
(By.XPATH, "//iframe[@id='myIframe']")))
driver.switch_to.frame(iframe)

然后找到所有的项目并像这个一样打印它们的库存

items = driver.find_elements(By.XPATH, "//div[@class='order']/div[1]")
for item in items:
print(item.text)

最后切换回默认内容以访问iframe 之外的元素

driver.switch_to.default_content()

注意:您需要导入以下

from selenium.webdriver.support import expected_conditions as EC

相关内容

  • 没有找到相关文章

最新更新