单击元素后,Selenium 抛出“WebDriverException:消息:没有这样的执行上下文”

问题描述 投票:0回答:1

我正在为一个类编写脚本,并且执行以下代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import random
import time

x = random.randrange(1, 16)
i = f"mntl-recipe-card-meta_{x}-0"
url = "https://www.eatingwell.com/recipes/17947/mealtimes/dinner/"

driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

link = driver.find_element(By.ID, i)
link.click()

time.sleep(2)

current_url = driver.execute_script("return window.location.href;")

print("Current URL:", current_url)
driver.quit()

代码一直运行,直到必须单击链接,然后抛出一个错误,显示“WebDriverException:消息:没有这样的执行上下文”。在我单击链接后,似乎会抛出错误,因为程序在新页面加载时停止工作。我希望能够在单击元素后执行操作,这样程序就会停止工作。

python selenium-webdriver
1个回答
0
投票

您发布的代码对我来说效果很好。我做了一些更改,向您展示一些潜在的改进,如果您发现它们有用的话......也许它会为您解决问题。

  1. 您可以使用 CSS 选择器获取页面上的所有食谱链接

    links = driver.find_elements(By.CSS_SELECTOR, "[id^='mntl-card-list-items_']")
    
  2. 通过使用#1,我们在页面上有一个包含所有此类链接的列表,我们可以使用

    random.choice()
    从列表中选择一个随机项目,而不是插入随机数 1-16(这不会获得所有链接)链接)。

    link = random.choice(links)
    
  3. 现在您的代码所做的就是单击链接,然后在导航后获取 URL。如果您想要的只是 URL,则无需点击即可从首页获取该 URL。

    print(link.get_attribute("href"))
    
  4. 如果您想要浏览器中的当前 URL,则不需要 JavaScript...您可以使用

    current_url = driver.current_url
    
  5. 你不需要睡觉

完整的工作代码是

from selenium import webdriver
from selenium.webdriver.common.by import By
import random

url = "https://www.eatingwell.com/recipes/17947/mealtimes/dinner/"

driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

links = driver.find_elements(By.CSS_SELECTOR, "[id^='mntl-card-list-items_']")
link = random.choice(links)
print(link.get_attribute("href"))
link.click()

current_url = driver.current_url

print("Current URL:", current_url)
© www.soinside.com 2019 - 2024. All rights reserved.