【问题标题】:Unable to locate an element within iframe using ember through Selenium无法通过 Selenium 使用 ember 在 iframe 中定位元素
【发布时间】:2019-07-31 17:39:01
【问题描述】:

我正在使用黄瓜做自动化(我第一次做自动化)。 UI 在 iF​​rame 中并使用 ember。 (UI代码来自其他团队,因此UI上的任何更改均不适用)

我正在尝试查找文本字段并填写该字段(最后一块)。但是,我一直找不到元素。任何人都可以帮助建议任何方法来找到它?

HTML 代码

  <div id="payeePassportNumber" class="form-row-line">
        <div id="ember866" class="rdc-component-base rdc-text-input rdc-text-input no-label label-top ember-view">  
            <div class="label-holder">
                <label>Passport Number</label><!---->
            </div>
            <div class="component-holder">
                <div class="component-wrapper textinput-wrapper">
                    <input type="text" placeholder="" maxlength="140" id="ember867" class="ember-text-field ember-view">
                </div>
            </div>
        </div>
    </div>

回答问题前的 Ruby 代码

session.within_frame(session.find(:xpath, "//[@id='myframe']")) do
    session.driver.browser.find_element(:id, 'payeeDetails').click
    if payeeDetails == 'Passport Number'
    session.find(:xpath,"//[text()[normalize-space()='#{payeeDetails}']]").click
    session.driver.browser.find_element(:id, 'payeePassportCountry').click
    session.find(:xpath,"//[text()[normalize-space()='#{country}']]").click
    session.fill_in session.find(:xpath, "//[@id='payeePassportNumber']/div/div[2]/div[contains(@Class, 'component-wrapper textinput-wrapper')]"), :with => "123456"

错误

 invalid selector: Unable to locate an element with the xpath expression //[@id='payeePassportNumber']///div/[contains(@Class, 'component-wrapper textinput-wrapper')] because of the following error:
    SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//[@id='payeePassportNumber']///div/[contains(@Class, 'component-wrapper textinput-wrapper')]' is not a valid XPath expression.
    (Selenium::WebDriver::Error::InvalidSelectorError)

回答问题后的 Ruby 代码

session.within_frame('myframe') do
        #find proxy type dropdown list & select proxy type
        session.find('#payeeDetails').click
        session.find("li", text: "#{payeeDetails}").click       
            if payeeDetails == 'Passport Number'

                #find country dropdownlist & select country
                session.find('#payeePassportCountry').click
                session.find(:xpath,"//*[text()[normalize-space()='#
                {country}']]").click
                #fills in proxy ID
                session.find('#payeePassportNumber').fill_in with: proxyID
            end
end

【问题讨论】:

  • @Sers 也许我仍然不明白您删除cssselector 标签 的编辑目标,但您的回答仍然建议使用CssSelector。
  • @DebanjanB 由于标签限制,我将 css 选择器替换为 capybara,并且 capybara 更相关,但问题已解决。
  • @Sers 看看你的编辑是如何破坏帖子的。您删除了标签css-selectors 以添加标签capybara,但您没有删除webdriverwait。请在编辑过程中小心,否则 OP 将永远不会收到规范和有效的答案。

标签: ruby selenium xpath css-selectors capybara


【解决方案1】:

你的错误告诉你出了什么问题:

"//[@id='payeePassportNumber']/div/div[2]/div[contains(@Class, 'component-wrapper textinput-wrapper')]"

不是一个有效的 XPath 表达式。

我怀疑@Class 被类名中的空格弄糊涂了。试试下面的 xpath:

"//div[@id='payeePassportNumber']/div/div[2]/div[contains(@class, 'component-wrapper') and  contains(@class, 'textinput-wrapper')]"

这有帮助吗?

【讨论】:

  • 感谢您的建议,但我遇到与其他人相同的错误.. 它说找不到该字段.. :(
【解决方案2】:

您不能将@Class 与大写 C 一起使用,总体而言您的选择器是错误的。
尝试使用如下简单的选择器:

  1. css 选择器:#payeePassportNumber input
  2. xpath://div[@id='payeePassportNumber']//input

【讨论】:

  • 不错。比我尝试修补用户的 xpath 好多了。
  • ohmygod...我没有意识到大写c..感谢您强调这一点..我之前尝试过使用这个//div[@id='payeePassportNumber']//输入,但是它仍然低于错误 ElementNotFound : Unable to find field #<:node::element tag="input" path="/HTML/BODY[1]/DIV[2]/DIV[1]/DIV[5]/ DIV[1]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[2]/DIV[1]/INPUT[1]">
  • @yanayeay 尝试等待并检查是否有任何 iframe
  • 我已经进入睡眠 5,但仍然无法找到字段.. 我有检查.. 只有一个 iframe... T_T
  • @yanayeay 请检查如何使用 Capybara 正确切换到 iframe here
【解决方案3】:

您的代码有很多问题:

  1. 你在不需要的地方调用 find。
  2. 您正在调用直接驱动程序方法(无论何时使用 .driver.browser,您都可能做错了什么)。
  3. 您将元素传递给不带元素的方法 (fill_in),
  4. 使用规范化空间执行复杂的 xpath 查询通常不是正确的方法。

如果没有看到您的代码所引用的所有 HTML(#payeeDetails,您尝试使用 normalize-space xpaths 来单击哪些元素等),很难对您的代码进行完整修复,但最简单的方法是填写HTML 中显示的输入字段(假设它位于 id 为“myframe”的 iframe 中)类似于

session.within_frame('myframe') do
  session.find('#payeePassportNumber').fill_in with: '123456'
end

【讨论】:

  • 您的答案没有解决 OP 的主要错误,即 invalid selector
  • @ThomasWalpole 1. session.within_frame('myframe') -> 这不行,我已经用过了,它找不到 iframe。我自己也不知道为什么。因此,我输入了 find xpath 2。我对编码真的很陌生,那些使用 driver.browser -> 我使用它是因为每当我尝试使用 find xpath 或 find css 时,我都找不到元素。 3.啊,我明白了..不会接受这个。 4.我在研究的时候找到了代码,呵呵,这样就可以找到元素了。
  • @ThomasWalpole capybara (3.14.0) -> 我的水豚版本
  • @ThomasWalpole 不,我使用了完全相同的代码session.within_frame('myframe'),不确定是否使用 ember(HTML 代码使用 ember)是否会表现不同?我还有很多东西要学。我从所有的 cmets 中学到了一些新东西。
  • @ThomasWalpole 愚蠢的我.. 当我使用session.within_frame('myframe') 时我没有引用任何引号我现在已经替换了代码.. 它工作正常。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多