【问题标题】:Opening element(url) in new tabs in Python Selenium在 Python Selenium 的新选项卡中打开元素(url)
【发布时间】:2021-09-04 08:17:41
【问题描述】:

目标: 需要打开一个网页,按类查找 url,然后在 chrome 的新标签中打开每个 url

我尝试了什么:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(executable_path="C:\\Users\xxx\Downloads\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("https://xxxxxxxx.com")
elements = driver.find_elements_by_class_name("post-comments")
for e in elements:
    e.click()
driver.quit()

当前输出:

它只是在同一个父窗口中打开第一个 url,然后停在那里.. 焦点不会指向基本 url,因此它无法在新选项卡中打开第二个和其他 url。

请告诉我你的建议。

Update1:​​当我搜索相对 xpath 时,我知道我需要使用正则表达式,这样我才能找到其中包含“响应”的所有链接。 为此,我尝试使用

driver.find_element_by_css_selector("a[href*='respond']]")

但它出错了没有find_element。

更新 2: 经过一些试验,我能够使用下面的代码实现我需要的最大输出。但是下面的代码只在第一页上工作,当下面的代码完成第一页时,就会有“NextPage”按钮,我需要点击它来打开那个页面,这将成为新的主页,我需要运行再次在该页面上的下面一段代码。如何在此页面上的元素完成后告诉下面的代码,单击“NextPage”按钮并在该页面的逻辑下方运行。请推荐

from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(executable_path="C:\\Users\xxx\Downloads\chromedriver_win32\chromedriver.exe")
driver.maximize_window()
driver.get("https://xxxxxxxx.com")
current_windows_handle = driver.current_window_handle
elements = driver.find_elements_by_css_selector('h2.post-title.entry-title>a')
for ele in (elements):
    url = [ele.get_attribute("href")]
    for x in url:
          time.sleep(2)
          driver.execute_script("window.open('');") 
          handles = driver.window_handles
          driver.switch_to.window(handles[1])
          driver.get(x)
          driver.find_element_by_xpath("//span[@class='mb-text'][contains(.,'Posts')]").click()
          time.sleep(2)
          driver.close()
          driver.switch_to.window(driver.window_handles[1])
          time.sleep(5)
          actualurl = driver.current_url
          with open(r'c:\test\new.txt', 'a') as text_file:
              text_file.write(actualurl + '\n')
          driver.close()
          time.sleep(5)
          driver.switch_to.window(current_windows_handle)
driver.close()
driver.quit()

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver


    【解决方案1】:

    错误有效,原因

    driver.find_element_by_css_selector("a[href*='respond']]")
    

    这是语法错误,但由于它包含在 "" 中,编译器不会显示它。

    试试这个:

    elements =  driver.find_elements_by_css_selector("a[href*='respond']")
    

    然后像这样打印长度:-

    print(len(elements))
    

    我假设它会包含一些元素。你也可以迭代它。请看下面,它应该可以帮助您弄清楚如何模拟这些动作。

    current_windows_handle = driver.current_window_handle
    elements = driver.find_elements_by_css_selector("a[href*='respond']")
    for ele in elements:
        time.sleep(2)
        driver.execute_script("window.open('');") # open a new tab.
        handles = driver.window_handles
        driver.switch_to.window(handles[1])
        driver.get(ele.get_attribute('href'))
        time.sleep(2)
        # Now it would have loaded a new url in new tab.
        # do whatever you wanna do.
        # Now close the new tab
        driver.close()
        time.sleep(2)
        driver.switch_to.window(current_windows_handle)
    

    更新 1:

    current_windows_handle = driver.current_window_handle
    elements = driver.find_elements_by_css_selector("a[href*='respond']")
    j = 0 
    for ele in range(len(elements)):
        time.sleep(2)
        elements = driver.find_elements_by_css_selector("a[href*='respond']")
        driver.execute_script("window.open('');") # open a new tab.
        handles = driver.window_handles
        driver.switch_to.window(handles[1])
        driver.get(elements[j].get_attribute('href'))
        time.sleep(2)
        j = j + 1
        # Now it would have loaded a new url in new tab.
        # do whatever you wanna do.
        # Now close the new tab
        driver.close()
        time.sleep(2)
        driver.switch_to.window(current_windows_handle)
    

    【讨论】:

    • 您好,感谢您的解释。现在它的打印长度正确,但是下一部分代码建议,当我包括在内时,它会打开一个新标签,但那里什么也没有。给出以下错误selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    • @asp : 在哪一行?
    • driver.get(ele.get_attribute('href')) 这一行
    • 是的会试一试,供您参考,当我使用 chrome 扩展真实路径并将此对象悬停时,我得到了这种值` //a[@href='xxxxxxxxxx.com/xxxxxx/#respond']` 所以这个我试图通过响应作为关键字进行搜索的原因
    • 看我们在a[href*='respond']上方使用css,//是xpath。你可以有一个等价的 xpath 为//a[contains(@href,'respond')]
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多