Как отправить ключи в форму без идентификатора и / или имени в селене (Python) - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над получением данных с веб-сайта, и каждый раз, когда я нажимаю на ссылку, чтобы получить номер телефона, открывается модальная форма, чтобы сначала запросить мой номер телефона, и мне показывается номер телефона.

Теперь у меня есть проблема: я хочу отправить ключи в поле ввода, поэтому, поскольку поле ввода не имеет имени или идентификатора, я нашел поле ввода с помощью xpath:

xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")

Я напечатал это, и он возвратил некоторые объекты селена, но когда я пытаюсь отправить ключи как:

xxx.send_keys('08100000000')

Вот фрагмент кода html:

<div class="row">
<div class="medium-12 columns">
    <div class="guest-text">
        One step closer! <br />
        <span>Please provide your contact number to view business contact details</span>
    </div>

    <form action="" data-abide="ajax" novalidate="novalidate">
        <div id="txtUserPhoneNumber" ng-show="!isLoggedIn && collectUserPhone == ''" class="guest-no">
            <label>
                <div class="guest-label">Phone Number</div>
                <input type="text" placeholder="081xxxxxxxx" ng-model="UserPhoneNew" required data-invalid="" aria-invalid="true" maxlength="11">

            </label>
        </div>
    </form>
</div>

Я пытался:

xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
xxx.send_keys('08100000000')

dummy_number = driver.find_element_by_xpath("//div[contains(@class, 'modal small guest')]/div[contains(@class, 'guest-modal-wrapper')]//form[1]//input[1]")
dummy_number.send_keys('081000000')

Я получил ошибку, сказав:

Traceback (most recent call last):
File "Dropbox/automation/vconnect.py", line 76, in <module>
    RunAutomation.instantiatechrome()
  File "Dropbox/automation/vconnect.py", line 61, in instantiatechrome
    xxx.send_keys('081xxxxxxxx')
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
  (Session info: chrome=66.0.3359.139)
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.13.0-39-generic x86_64)

Ваше мнение приветствуется.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Об ошибке, вам нужно подождать, пока элемент будет отображен и включен для взаимодействия. Вы можете узнать это, читая о «Простоте и ясности в Селене».

Здесь вы можете найти дополнительную информацию о том, что: https://stackoverflow.com/a/27600986/5120498

Также дополнительный совет.

Обычно мы используем XPath только тогда, когда элемент очень сложен, или даже невозможно найти с помощью идентификатора или CssSelector. Это потому, что XPath не распространен как CssSelector и его сложнее понять, в зависимости от того, как он написан.

Когда нам нужно найти какой-либо элемент с использованием XPath или CssSelector, в первую очередь нам нужно проверить, какие значения не изменятся после взаимодействия со страницей, а также что предоставляют нам уникальное значение (когда нам нужен только один элемент, OFC).

Так как в вашем html есть только один элемент с идентификатором txtUserPhoneNumber, и ваш нужный элемент находится внутри него, давайте начнем выбирать его. Затем посмотрите имя тега искомого элемента. Есть только один элемент input внутри? Ницца! Таким образом, мы можем достичь элемента, используя только эти несколько сведений.

CSSSelector:

# txtUserPhoneNumber input

И

Xpath:

// * [@ id = 'txtUserPhoneNumber'] // input

0 голосов
/ 02 мая 2018

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

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

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

Однако существует несколько проблем, включая совместимость версии между используемыми вами двоичными файлами:

  • Вы используете chromedriver = 2,35
  • В заметках о выпуске chromedriver = 2,35 четко упоминается следующее:

Поддержка Chrome v62-64

  • Вы используете хром = 66.0
  • Примечания к выпуску ChromeDriver v2.38 четко упоминает следующее:

Поддержка Chrome v65-67

Таким образом, существует явное несоответствие между ChromeDriver версией ( v2.35 ) и Chrome Browser версией ( v66.0 )

Решение

  • Обновление Селен до текущих уровней Версия 3.11.0 .
  • Обновление ChromeDriver до текущей ChromeDriver v2.38 уровень.
  • Сохранить Chrome версия на Chrome v66.x уровней. ( в соответствии с примечаниями к выпуску ChromeDriver v2.38 )
  • Очистите ваше Рабочее пространство проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Используйте CCleaner , чтобы стереть все рутинные операции ОС до и после выполнения test Suite .
  • Если ваша базовая версия Web Client устарела, удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Web Клиент .
  • возьмите перезагрузку системы .
  • Когда вы видите ElementNotVisibleException , вам нужно заставить WebDriverWait для WebElement быть активируемым следующим образом:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # other code
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//form[@data-abide='ajax']//input[@ng-model='UserPhoneNew']"))).send_keys("08100000000")
    
  • Выполните @Test.

Примечание : Здесь вы найдете подробное обсуждение ElementNotVisibleException: Selenium Python

0 голосов
/ 02 мая 2018

В сообщении об ошибке говорится, что элемент не виден. Таким образом, вы должны явно ждать, пока он не станет видимым. Используйте Ожидаемое условие, как описано здесь .

В конце ваш код может выглядеть следующим образом (ожидание до 120 секунд):

from selenium.webdriver.support import expected_conditions as EC

...

wait = WebDriverWait(driver, 120)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@placeholder='081xxxxxxxx']")))
element.send_keys('08100000000')
...