【问题标题】:Selenium - iframe headache - unable to solveSelenium - iframe 头痛 - 无法解决
【发布时间】:2014-07-06 20:12:19
【问题描述】:

我已经用这个把头撞到墙上已经足够长的时间了,所以我现在可以转过来了。

我有一个带有 iframe 的页面:

<iframe frameborder="0" allowtransparency="true" tabindex="0" src="" title="Rich text editor, listing_description" aria-describedby="cke_18" style="width:100%;height:100%">

当我通过 xpath 使用时: '//*[@aria-describedby="cke_18"]'

我得到一个 web 元素,其中:

>>> elem
<selenium.webdriver.remote.webelement.WebElement object at 0x104327b50>
>>> elem.id
u'{3dfc8264-71bc-c948-882a-acd6a8b93ab5}'
>>> elem.is_displayed
<bound method WebElement.is_displayed of <selenium.webdriver.remote.webelement.WebElement object at 0x104327b50>>

现在,当我尝试提取信息以将信息放入此 iframe 时,出现以下错误:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py", line 560, in debugfile debugger.run("runfile(%r, args=%r, wdir=%r)" % (filename, args, wdir)) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 400, in run exec cmd in globals, locals File "<string>", line 1, in <module> File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile execfile(filename, namespace) File "/Users/jasonmellone/Documents/PythonProjects/nakedApts.py", line 88, in <module> a = elem.find_element_by_xpath(".//*") File "/Library/Python/2.7/site-packages/selenium-2.41.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 201, in find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath) File "/Library/Python/2.7/site-packages/selenium-2.41.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 377, in find_element {"using": by, "value": value})['value'] File "/Library/Python/2.7/site-packages/selenium-2.41.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 370, in _execute return self._parent.execute(command, params) File "/Library/Python/2.7/site-packages/selenium-2.41.0-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 166, in execute self.error_handler.check_response(response) File "/Library/Python/2.7/site-packages/selenium-2.41.0-py2.7.egg/selenium/webdriver/remote/errorhandler.py", line 164, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"xpath","selector":".//*"}' ; Stacktrace: at FirefoxDriver.prototype.findElementInternal_ (file:///var/folders/8x/0msd5dd13l9453ff9739rj7w0000gn/T/tmpmH4ARe/extensions/fxdriver@googlecode.com/components/driver_component.js:8905) at FirefoxDriver.prototype.findChildElement (file:///var/folders/8x/0msd5dd13l9453ff9739rj7w0000gn/T/tmpmH4ARe/extensions/fxdriver@googlecode.com/components/driver_component.js:8917) at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/8x/0msd5dd13l9453ff9739rj7w0000gn/T/tmpmH4ARe/extensions/fxdriver@googlecode.com/components/command_processor.js:10884) at DelayedCommand.prototype.executeInternal_ (file:///var/folders/8x/0msd5dd13l9453ff9739rj7w0000gn/T/tmpmH4ARe/extensions/fxdriver@googlecode.com/components/command_processor.js:10889) at DelayedCommand.prototype.execute/< (file:///var/folders/8x/0msd5dd13l9453ff9739rj7w0000gn/T/tmpmH4ARe/extensions/fxdriver@googlecode.com/components/command_processor.js:10831)

现在,我不是 selenium 开发人员,不知道这意味着什么。

当我运行以下代码时:

   elem = Helper.getElementByxPath(mydriver,'//*[@aria-describedby="cke_18"]',"ABC"); 
   mydriver.switch_to_frame(elem);

上面运行Helper.getElementByxPath 是:

    def getElementByxPath(mydriver,xPath,valueString):

        try:

            a = mydriver.find_element_by_xpath(xPath);
            a.send_keys(valueString);
            return a;
        except:
            print "Unexpected error:", sys.exc_info()[0];
            return 0;

   a = elem.find_element_by_xpath(".//*")

给我以下内容:

>>> elem.id

 u'{8be4819b-f828-534a-9eb2-5b791f42b99a}'

还有以下语句:

  a = elem.find_element_by_xpath(".//*")

给我另一个巨大的错误。

让我感到沮丧的是:

  1. 我不需要从 iframe 中的嵌入式输入中获取信息,我只想发送密钥。
  2. 很高兴只需要“Keys.TAB”,直到我到达正确的框和 Cursor.location.element.send_keys(伪代码)。
  3. 我只想在页面上键入文本,因为光标已经在正确的位置(我不能轻松地做到这一点吗?)

我的目标是只是在这里发送密钥,而不是做任何更深层次的事情,如果没有遇到上述问题,我似乎无法解决这个问题。

有没有办法解决这个问题?我很失败,希望有人能回答。

谢谢!

【问题讨论】:

  • stacktrace 唯一重要的部分是 `u'Unable to locate element: {"method":"xpath","selector":".//*"}' ;堆栈跟踪:`.
  • @PadraicCunningham 是的,但我该怎么办?
  • 你是否使用过 firebug 或类似的东西来检查元素,看看你是否真的得到了你想要的正确 xpath?
  • @PadraicCunningham 当然,但你是什么意思? iframe 没有“名称”,但该元素在我访问它的方式上似乎是正确的。我有萤火虫,所以如果我在这里遗漏了什么,请告诉我。
  • 看来您正在处理 CKEditor。 aria-describedby="cke_18" 不适合使用。如果独一无二,我建议使用 .//iframe[@title='Rich text editor, listing_description'] 之类的东西。 (但最好是添加唯一的类名)。供您参考,这里有一篇您可能会看的文章:Test WYSIWYG editors using Selenium WebDriver。基本上,你可以只调用编辑器的原生 JavaScript API 而不是处理 iframe。

标签: python python-2.7 iframe selenium


【解决方案1】:

Selenium 只能访问当前帧中的元素。您可以像这样切换到更深的框架:

driver.switch_to_frame(IDENTIFIER)

标识符在哪里: - 框架的名称 - 对框架的 webelement 引用 - 帧的数字索引

此处的 API 参考:http://selenium-python.readthedocs.org/en/latest/api.html

当您完成iframe 后,您可以使用以下命令切换到顶层:

driver.switch_to_default_content()

【讨论】:

  • 请见上文。我理解你的观点,但这并没有给我想要的最终结果。
【解决方案2】:

解决我的具体问题的是下面的sn-p代码:

            elem = Helper.getElementByxPath(mydriver,".//iframe[@title='theTitleOfMyIframe']","ABC"); 
            mydriver.switch_to_frame(elem);
            elem2 = Helper.getElementByxPath(mydriver,"//body[@contentEditable='true']","ABC");

我的 xpath 函数在哪里:

            def getElementByxPath(mydriver,xPath,valueString):

                try:

                    a = mydriver.find_element_by_xpath(xPath);
                    a.send_keys(valueString);
                    return a;
                except:
                    print "Unexpected error:", sys.exc_info()[0];
                    return 0;

一旦您确定您的 ckeditor 在范围内,您应该能够运行以下命令:

  mydriver.execute_script(str("arguments[0].innerHTML = 'test'"), elem2)

它应该可以按您的预期工作!希望这可以帮助其他人节省时间!

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2016-04-20
    • 2012-07-29
    • 1970-01-01
    • 2014-03-06
    • 2017-05-30
    相关资源
    最近更新 更多