python - 如何使用机器人框架,selenium 打开新窗口?

标签 python selenium selenium-webdriver webdriver robotframework

我测试的页面上有一个链接默认在新标签页中打开。我需要打开链接并在新打开的页面上验证一些值。 因为我发现 selenium 不支持使用选项卡,所以我试图在新窗口中打开链接,但它仍然不起作用.. 我实现了 python 函数来保持 SHIFT 键(我之前已经为 CTRL 做过这个并且它有效)然后我调用了“点击”函数,但链接仍在新选项卡中打开

from robot.libraries.BuiltIn import BuiltIn
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

class CustomSeleniumLibrary(object):
    def __init__(self):
        self.driver = None
        self.library = None
        self.ac = None

    def get_library_instance(self):
        if self.library is None:
            self.library = BuiltIn().get_library_instance('ExtendedSelenium2Library')
        return self.library

    def get_action_chain(self):
        if self.ac is None:
            self.ac = ActionChains(self.get_library_instance()._current_browser())
        return self.ac

def hold_shift(self):
        actionChain = self.get_action_chain()
        actionChain.key_down(Keys.SHIFT)
        actionChain.perform()

机器人关键字是

Open project detail
     wait until element is visible  ${LINK_TO_PROJECT}
     ${project}=  get text  ${LINK_TO_PROJECT}
     hold shift
     click element   ${LINK_TO_PROJECT}
     #sleep  2s
     #release shift
     element should contain   //h3  Project Details: ${project}

我尝试了许多 sleep 、释放 key 等变体,但它从未真正在新窗口中打开链接。我还尝试验证新打开的选项卡中的数据(不尝试在新窗口中打开),但它总是很快重定向到原始选项卡,因此新选项卡上的 DOM 尚未加载。感谢任何建议!

最佳答案

您可以使用以下代码来处理在新标签页中打开的页面:

current = driver.current_window_handle
driver.find_element_by_css_selector('a').click() # use own selector
new_tab = [tab for tab in driver.window_handles if tab != current][0]
driver.switch_to.window(new_tab)
# do some actions
driver.close()
driver.switch_to.window(current)

你也可以做一些小改动(不推荐,但是......)以避免处理新标签并强制链接在当前标签中打开:

link = driver.find_element_by_css_selector('a')
driver.execute_script('arguments[0].target="_self";', link)

关于python - 如何使用机器人框架,selenium 打开新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42908678/

相关文章:

python - 如何隐式确定 python 中的数据框列类型? (隐式转换)

selenium-webdriver - 输入后验证 selenium Webdriver 的 sendKeys(input)

java - 使用 equalsIgnoreCase 时,if else 在 selenium webdriver 中不起作用

python - (-215:声明失败)number <max_number在函数 'cv::icvExtractPattern'中出错吗?

python - Django social auth GitHub 认证

python - 为什么 MySQL 连接查询的输出作为嵌套列表项返回?

selenium - 为什么 ng e2e 构建模块?

selenium - WebdriverIO - 获取浏览器日志

python - 如何在 Selenium 中选择表格单元格中的所有文本

python-3.x - 如何使用 Selenium 和 Python 更改 useragent 中显示的操作系统信息?