无法通过硒使用余烬在iframe中定位元素

时间:2019-03-10 04:17:36

标签: ruby selenium xpath css-selectors capybara

我正在使用黄瓜进行自动化(这是我第一次进行自动化)。用户界面位于iFrame中,并使用余烬。 (用户界面代码来自另一个团队,因此,用户界面的任何更改均不适用)

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

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

3 个答案:

答案 0 :(得分:0)

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

"//[@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')]"

有帮助吗?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您的代码有很多错误:

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

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

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