【问题标题】:do Python's Selenium module and the selenium-webdriver node package implement frame switching differently?Python 的 Selenium 模块和 selenium-webdriver 节点包实现帧切换的方式不同吗?
【发布时间】:2020-09-04 00:14:32
【问题描述】:

我正在对Selenium 绑定PythonJavascript 进行一些试验,发现一些我不明白的差异。

具体来说,我正在使用两个脚本(一个 Python,一个 .js 使用 node 运行)来

  • abut:blank打开一个Firefox窗口
  • 打开console(即自动化Ctrl+Shift+k快捷方式)
  • 打开控制台后找到chrome context 中提供的 iframe
  • 切换到该 iframe
  • 计算结果文档中的所有按钮

Python

脚本是


from selenium.webdriver import Firefox, DesiredCapabilities, FirefoxProfile
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.keys import Keys

import time
import traceback

options = Options()
webdriver = Firefox(options=options)
webdriver.get("about:blank")
try:
    time.sleep(3)
    with webdriver.context(webdriver.CONTEXT_CHROME):
        time.sleep(3)

        console = webdriver.find_element(By.ID, "tabbrowser-tabs")
        console.send_keys(Keys.LEFT_CONTROL + Keys.LEFT_SHIFT + 'k')        
        time.sleep(3)        

        ifr = webdriver.find_element_by_class_name("devtools-toolbox-bottom-iframe")
        webdriver.switch_to.frame(ifr)

        elts = webdriver.find_elements_by_tag_name("button")
        print(len(elts)) 
                       
except Exception as error:
    traceback.print_exc()
    

这会打印回13(因此它找到了 13 个按钮)。另一方面,如果我注释掉该行

webdriver.switch_to.frame(ifr)

(即我不切换到框架)然后它会打印出5

Javascript

脚本在这里

var webdriver = require('selenium-webdriver'),
    By = webdriver.By,
    until = webdriver.until;

var firefox = require('selenium-webdriver/firefox');
var inpt = require('selenium-webdriver/lib/input');

var options = new firefox.Options();

var driver = new webdriver.Builder()
    .forBrowser('firefox')
    .setFirefoxOptions(options)
    .build();

(async function(){
    await driver.get('about:blank');
    await driver.setContext("chrome");

    var tabs = await driver.findElement(By.id('tabbrowser-tabs'));
    await tabs.sendKeys(inpt.Key.CONTROL + inpt.Key.SHIFT + 'k');    

    var el, btns;
        
    setTimeout(
    async () => {el = await driver.findElement(By.css('.devtools-toolbox-bottom-iframe')); },
    3000
    );
        
    await driver.switchTo().frame(el);

    setTimeout(
    async () => {
        btns = await driver.findElements(By.css("button"));
        await console.log(btns.length);
    },
    10000
    );    
})();

无论我做什么,无论我是否离开帧切换线,这个(使用node 运行)都会打印出5

await driver.switchTo().frame(el);

在那里。

它不会出错,所以我知道它会找到框架并成功完成 switchTo 应该做的任何事情,但它找到的 5 个按钮似乎是相同的,无论 switchTo 是否存在(我'还打印了它们的类和ID等;无论是否使用switch命令,行为都是相同的。

【问题讨论】:

    标签: python selenium selenium-webdriver firefox


    【解决方案1】:

    我相信我的问题的答案是“不”,我想我明白发生了什么:async/await 事情让我感到很痛苦,作为一个新手..

    在sn-p中

    var el, btns;
            
        setTimeout(
        async () => {el = await driver.findElement(By.css('.devtools-toolbox-bottom-iframe')); },
        3000
        );
            
        await driver.switchTo().frame(el);
    

    我认为switchTo 发生在之前分配给el,因为我将switchTo 放在setTimeout 之外。所以当switchTo 发生elundefined 时,这不会引发错误(我已经检查过你可以switchTo 一个undefined 框架没有问题)。

    将该开关命令移至超时,如

    var el, btns;
            
        setTimeout(
            async () => {
                el = await driver.findElement(By.css('.devtools-toolbox-bottom-iframe'));
                await driver.switchTo().frame(el);
            },
            3000
        );
    

    使 Python 和 Javascript 版本达成协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多