Невозможно найти элемент внутри iframe, используя ember через Selenium - PullRequest
0 голосов
/ 10 марта 2019

Я делаю автоматизацию с помощью огурца (я впервые делаю автоматизацию). Пользовательский интерфейс в iFrame и использует ember. (Код пользовательского интерфейса принадлежит другой команде, поэтому любые изменения пользовательского интерфейса не применяются)

Я пытаюсь найти текстовое поле и заполнить поле (последний кусок). Тем не менее, я продолжаю получать элемент не найден. Кто-нибудь может помочь предложить любой метод, чтобы найти его?

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"

Error

 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

Ответы [ 4 ]

0 голосов
/ 10 марта 2019

С вашим кодом не все в порядке:

  1. Вы звоните и находите то, что вам не нужно.
  2. Вы вызываете методы прямого драйвера (в любое времявы используете .driver.browser вы, вероятно, делаете что-то не так).
  3. Вы передаете элементы методам, которые не принимают элементы (fill_in),
  4. Выполнение сложного xpathзапросы с нормализованным пространством, как правило, никогда не являются правильным подходом.

Не видя весь HTML-код, на который ссылается ваш код (#payeeDetails, какие элементы вы пытаетесь щелкнуть с помощью normalize-space xpaths и т. Д.), Трудно дать полные исправления для вашего кода, носамый простой способ заполнить поле ввода, показанное в вашем HTML (при условии, что он находится в iframe с идентификатором 'myframe'), будет выглядеть примерно так:

session.within_frame('myframe') do
  session.find('#payeePassportNumber').fill_in with: '123456'
end
0 голосов
/ 10 марта 2019

Вы не можете использовать @Class с заглавной буквой C, и в целом ваш селектор неверен.
Попробуйте использовать простые селекторы, как показано ниже:

  1. css selector: #payeePassportNumber input
  2. xpath: //div[@id='payeePassportNumber']//input
0 голосов
/ 10 марта 2019

Это сообщение об ошибке ...

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)

... подразумевает, что использованная вами стратегия Locator не была действительной.

В вашей попытке есть ровно 2 вопроса.

  • Прописные буквы C недопустимы и должны быть заменены строчными c в пределах @Class,
  • Три /// в xpath недействительны / эффективны.

Решение

Чтобы заполнить поле с последовательностью символов , вы можете использовать одну из следующих Стратегий локатора :

  • CSS

    "div.form-row-line#payeePassportNumber div.component-holder input.ember-text-field.ember-view"
    
  • * 1045 XPath *:

    "//div[@class='form-row-line' and @id='payeePassportNumber']//div[@class='component-holder']//input[@class='ember-text-field ember-view']"
    

Здесь вы можете найти соответствующую дискуссию по Способы работы с #document в iframe

0 голосов
/ 10 марта 2019

Ваша ошибка говорит вам, что не так:

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

Помогает ли это?

...