如何使用Selenium WebDriver for python在浏览器上打开新窗口?

of1yzvn4  于 2023-05-21  发布在  Python
关注(0)|答案(6)|浏览(178)

我正在尝试使用selenium for python在浏览器中打开新选项卡或新窗口。如果打开了一个新标签页或新窗口,这并不重要,重要的是打开了浏览器的第二个示例。
我已经尝试了几种不同的方法,但没有一种成功。
1.切换到不存在的窗口,希望在定位所述窗口失败时打开新窗口:
driver.switch_to_window(None)
1.遍历打开的窗口(尽管目前只有一个)

for handle in driver.window_handles:
    driver.switch_to_window(handle)

1.尝试模拟键盘按键

from selenium.webdriver.common.keys import Keys
driver.send_keys(Keys.CONTROL + 'T')

特别是这个问题,它似乎不可能直接将密钥发送到浏览器,只能发送到像这样的特定元素:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T')

然而,当这样的命令被发送到一个元素时,它似乎什么也不做。我试图定位页面上最顶层的HTML元素并将键发送到该元素,但再次失败:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T')

我在网上找到了这个的另一个版本,但是我无法验证它的有效性,因为我不确定需要导入什么类/模块

act = ActionChains(driver)
act.key_down(browserKeys.CONTROL)
act.click("").perform()
act.key_up(browserKeys.CONTROL)

一些非常相似但语法不同的东西(我不确定其中一个或两个语法是否正确)

actions.key_down(Keys.CONTROL)
element.send_keys('t')
actions.key_up(Keys.CONTROL)
dgiusagp

dgiusagp1#

你这样做怎么样

driver = webdriver.Firefox() #First FF window
second_driver = webdriver.Firefox() #The new window you wanted to open

根据要与哪个窗口交互,相应地发送命令

print driver.title #to interact with the first driver
print second_driver.title #to interact with the second driver

对于所有向下投票者:

OP要求“it is only important that a second instance of the browser is opened.”。这个答案并不包括每个用例的所有可能需求。下面的其他答案可能适合您的特定需求。

kninwzqo

kninwzqo2#

您可以使用execute_script打开新窗口。

driver = webdriver.Firefox()
driver.get("https://linkedin.com")
# open new tab
driver.execute_script("window.open('https://twitter.com')")
print driver.current_window_handle

# Switch to new window
driver.switch_to.window(driver.window_handles[-1])
print " Twitter window should go to facebook "
print "New window ", driver.title
driver.get("http://facebook.com")
print "New window ", driver.title

# Switch to old window
driver.switch_to.window(driver.window_handles[0])
print " Linkedin should go to gmail "
print "Old window ", driver.title
driver.get("http://gmail.com")
print "Old window ", driver.title

# Again new window
driver.switch_to.window(driver.window_handles[1])
print " Facebook window should go to Google "
print "New window ", driver.title
driver.get("http://google.com")
print "New window ", driver.title
igetnqfo

igetnqfo3#

我建议在Firefox上使用CTRL + N命令来减少内存使用,而不是创建新的浏览器示例。

import selenium.webdriver as webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox()
body = browser.find_element_by_tag_name('body')
body.send_keys(Keys.CONTROL + 'n')

Dhiraj已经提到了切换和控制窗口的方法。

dohp0rv5

dohp0rv54#

driver = webdriver.Chrome()
driver.execute_script("window.open('');")
driver.get('first url')

driver.switch_to.window(driver.window_handles[1])
driver.get('second url')
e4yzc0pl

e4yzc0pl5#

在JavaScript中,窗口和标签之间没有区别。
driver.window_handles认为两者相同。
但是,如果需要打开一个新窗口,有几种方法:(所需的导入见[3])
1.模拟ctrl+N。新版本不支持。看这个评论。

(
        ActionChains(driver)
        .key_down(Keys.CONTROL)
        .send_keys('n')
        .key_up(Keys.CONTROL)
        .perform()
        )

body = driver.find_element_by_tag_name('body')
body.send_keys(Keys.CONTROL + 'n')

1.按住shift键,然后点击页面上的链接--只有页面上有链接时才有效。

(
        ActionChains(driver)
        .key_down(Keys.SHIFT)
        .click(driver.find_element_by_tag_name("a"))
        .key_up(Keys.SHIFT)
        .perform()
        )

如果没有的话,可以创建一个...(修改当前页面!)

driver.execute_script('''{
    let element=document.createElement("a");
    element.href="about:home";
    element.id="abc"
    element.text="1";
    document.body.appendChild(element);
    element.scrollIntoView();
    }''')

(
        ActionChains(driver)
        .key_down(Keys.SHIFT)
        .click(driver.find_element_by_id("abc"))
        .key_up(Keys.SHIFT)
        .perform()
        )

...或导航到具有一个的页面。(如果您在会话开始时执行此操作,或打开新选项卡执行此操作,然后关闭它,则不会有问题)

driver.get("data:text/html,<a href=about:blank>1</a>")
(
        ActionChains(driver)
        .key_down(Keys.SHIFT)
        .click(driver.find_element_by_tag_name("a"))
        .key_up(Keys.SHIFT)
        .perform()
        )

看起来像是黑客
1.(Firefox)关闭“在选项卡中打开链接,而不是在新窗口中打开链接”选项,然后执行window.open()
Settings to open browser links in new tab, and external links in new window | Firefox Support Forum | Mozilla SupportBrowser.link.open_newwindow - MozillaZine Knowledge Base
browser.link.open_newwindow -用于Firefox标签中的链接
3 =将新窗口转移到新选项卡(默认)
2 =允许链接打开新窗口
1 =强制新窗口进入同一选项卡
此选项应设置为2。[2]
请注意,根据https://github.com/SeleniumHQ/selenium/issues/2106#issuecomment-320238039-permalink,不可能使用FirefoxProfile [1]设置该选项。

options=webdriver.FirefoxOptions()
options.set_preference("browser.link.open_newwindow", 2)
driver=Firefox(firefox_options=options)

driver.execute_script("window.open()")

1.对于Selenium 4.0.0(预发布。目前,您可以使用例如pip install selenium==4.0.0b4)安装它,可以做到:

driver.execute(
    selenium.webdriver.remote.command.Command.NEW_WINDOW,
    {"type": "window"}
)

技术来自this answer
[1]:在当前版本中,由于某种原因,这可以工作,并将browser.link.open_newwindow设置为2

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.link.open_newwindow", 3)
fp.default_preferences["browser.link.open_newwindow"]=3
fp.DEFAULT_PREFERENCES["browser.link.open_newwindow"]=3
driver=Firefox(firefox_profile=fp)

而这将选项值保持为3

driver=Firefox()

[2]:如果该值设置为3,则window.open()将在新选项卡中打开,而不是在新窗口中打开。
[3]:所有必需的导入:

from selenium import webdriver
from selenium.webdriver import Firefox, FirefoxProfile
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

[4]:这个答案只涵盖了如何打开一个新窗口。要切换到新窗口并返回,请使用WebDriverWaitdriver.switch_to.window(driver.window_handles[i])。请参阅https://stackoverflow.com/a/51893230/5267751了解更多详细信息。

guykilcj

guykilcj6#

driver.switch_to.new_window()

将打开一个新窗口。
然后你可以上网搜索

driver.get("https://google.com")

相关问题