【问题标题】:Pressing ctrl+t doesn't work in Selenium Webdriver using ActionChains使用 ActionChains 在 Selenium Webdriver 中按 ctrl+t 不起作用
【发布时间】:2019-03-14 11:21:18
【问题描述】:

我需要在我的测试中打开一个新的浏览器选项卡,并且我了解到最好的方法是简单地将适当的密钥发送到浏览器。我使用的是 Windows,所以我使用 ActionChains(driver).send_keys(Keys.CONTROL, "t").perform(),但是,这没有任何作用。

我尝试了以下方法来测试Keys.CONTROL 是否正常工作:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
def test_trial():
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/")
    ActionChains(driver).send_keys(Keys.CONTROL, "v").perform()

这确实会将我在剪贴板中复制的所有内容传递到默认情况下处于焦点的 Google 搜索框。

这是我想使用的,但不起作用:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
def test_trial():
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/")
    ActionChains(driver).send_keys(Keys.CONTROL, "t").perform()

浏览器似乎没有任何反应,没有打开新标签,没有对话框,没有通知。有谁知道这是为什么?

【问题讨论】:

    标签: python selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    试试这个 java Script Executor 它应该可以工作。

    link="https://www.google.com"
    driver.execute_script("window.open('{}');".format(link))
    

    Edited 带有窗口句柄的代码。

    driver=webdriver.Chrome()
    driver.get("https://www.google.com")
    window_before = driver.window_handles[0]
    
    link="https://www.google.com"
    driver.execute_script("window.open('{}');".format(link))
    window_after = driver.window_handles[1]
    driver.switch_to.window(window_after)
    
    driver.find_element_by_name("q").send_keys("test")
    

    【讨论】:

    • 谢谢!请问如何获得这个新窗口的焦点?它已创建并且浏览器切换到它,但我通过 webdriver 发送的所有命令似乎都在原始窗口中执行。
    • 试试窗口句柄。
    • 我现在切换到新窗口,但是在尝试与我得到的元素交互时:stale element reference: element is not attached to the page document
    • switch_to.window 方法工作正常(我尝试切换到window_before)但是当我尝试在新窗口中单击一个元素时,我仍然得到同样的错误
    • @CrispJam:我已经测试过,然后在这里发布。
    【解决方案2】:

    尝试执行此脚本:

    driver.execute_script("window.open('https://www.google.com');")
    

    例如

    myURL = 'https://www.google.com'
    driver.execute_script("window.open('" + myURL + "');")
    

    【讨论】:

    • 这似乎解决了我的问题,谢谢!您能否将我链接到这方面的文档?我从未见过这种execute_script 方法被使用过,我想了解更多关于它是如何工作的。
    • @CrispJam execute_script 通过WebDriver 执行任何javascript。你可以阅读它here
    • 感谢参考!一个后续问题:我可以在变量中传递 URL 而不是字符串文字吗?例如:driver.execute_script("window.open(myURL);")
    • 如果回答对整个网站有利,请记住考虑接受。 stackoverflow.com/help/someone-answers
    • @Nihal 您在编辑中的建议似乎对我不起作用。我现在有这个:driver.execute_script("window.open(" + address[0] + ");"),我收到以下错误:SyntaxError: missing ) after argument list
    【解决方案3】:

    您已经使用 JavaScript 执行获得了一些很好的答案,但我很好奇为什么您的示例一开始就不起作用。

    您的 ActionChains 行可能在页面完全加载之前执行;您可以尝试按如下方式添加等待:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.keys import Keys
    def test_trial():
        driver = webdriver.Chrome()
        driver.get("https://www.google.com/")
        try:
            element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(By.TAG_NAME("body")))
        ActionChains(driver).send_keys(Keys.CONTROL, "t").perform()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多