无法使用 ember 通过 Selenium 在 iframe 中定位元素

Unable to locate an element within iframe using ember through Selenium

我正在使用黄瓜做自动化(我第一次做自动化)。 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

你的错误告诉你哪里出了问题:

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

不是有效的 XPath 表达式。

我怀疑@Class被class名字中的space搞糊涂了。尝试以下 xpath:

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

有帮助吗?

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

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

您的代码有很多问题:

  1. 您在不需要的地方调用 find。
  2. 您正在调用直接驱动程序方法(任何时候您使用 .driver.browser 您可能做错了什么)。
  3. 您将元素传递给不接受元素的方法(fill_in),
  4. 使用 normalize-space 进行复杂的 xpath 查询通常不是正确的方法。

如果没有看到您的代码所指的所有 HTML(#payeeDetails,您尝试使用 normalize-space xpath 等点击哪些元素),很难为您的问题提供完整的修复代码,但填写 HTML 中显示的输入字段的最简单方法(假设它位于 id 为 'myframe' 的 iframe 中)类似于

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