无法使用 ember 通过 Selenium 在 iframe 中定位元素
Unable to locate an element within iframe using ember through Selenium
我正在使用黄瓜做自动化(我第一次做自动化)。 UI 在 iFrame 中并使用 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 一起使用,总的来说您的选择器是错误的。
尝试使用如下简单的选择器:
- css 选择器:
#payeePassportNumber input
- xpath:
//div[@id='payeePassportNumber']//input
您的代码有很多问题:
- 您在不需要的地方调用 find。
- 您正在调用直接驱动程序方法(任何时候您使用
.driver.browser
您可能做错了什么)。
- 您将元素传递给不接受元素的方法(
fill_in
),
- 使用 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
我正在使用黄瓜做自动化(我第一次做自动化)。 UI 在 iFrame 中并使用 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 一起使用,总的来说您的选择器是错误的。
尝试使用如下简单的选择器:
- css 选择器:
#payeePassportNumber input
- xpath:
//div[@id='payeePassportNumber']//input
您的代码有很多问题:
- 您在不需要的地方调用 find。
- 您正在调用直接驱动程序方法(任何时候您使用
.driver.browser
您可能做错了什么)。 - 您将元素传递给不接受元素的方法(
fill_in
), - 使用 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