Splinter: выбор правильной кнопки

Я пытаюсь автоматизировать вход на веб-сайт, чтобы получить информацию со своей метеостанции. Страница входа находится по адресу http://www.lacrossealertsmobile.com/v1.2/.

Когда я смотрю на исходный код, я вижу несколько строк, которые говорят

<button type="submit" class="btn btn-default">Submit</button>

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

<div data-role="page" id="userLogin">
    <div data-role="header">
        <h1>Login</h1>
    </div>
    <div class="logo-container">
        <div class="logo-banner"></div>
    </div>
    <div class="container">
        <div class="row list-group-item active">
            <div class="col-md-12">
              <h4 class="text-center" style="font-weight: 500; margin:5px;">User Login</h4>
            </div>
        </div>
        <div class="row">
            <div class="col-md-12" style="font-size:1.2em;">
                <form role="form" id="formLogin" style="margin: 10px 0;">
                    <div class="form-group">
                        <label for="exampleInputEmail1">User Name (email address)</label>
                        <input type="text" class="form-control" id="iLogEmail" placeholder="Email" required>
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">Password</label>
                        <input type="password" class="form-control" id="iLogPass" placeholder="Password" required>
                    </div>
                    <div class="form-group text-center">
                        <div class="bs-callout bs-callout-warning" id="userLogin-warning" style="display:none;">warning text</div>
                    </div>
                    <button type="submit" class="btn btn-default">Submit</button>
                </form>
                <br>
            </div> 
        </div>
        <div class="row list-group-item list-group-item-success" id="newUserDiv">
            <div class="col-md-12">
              <h4 class="text-center" style="font-weight: 300; margin:5px;">New Users - Click here to get started</h4>
            </div>
        </div>
    </div>
</div>

Документация Splinter гласит

Методы поиска являются цепочечными, поэтому вы можете найти потомков ранее найденного элемента.

Поэтому я попытался сделать это с помощью следующего:

login = browser.find_by_id('userLogin')
login.first.find_by_text('Submit')

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

login.first.find_by_text('Submit')[0].click()

Это не сработало. В конце концов я обнаружил, что это потому, что элемент [0] выше не виден. Методом проб и ошибок я обнаружил, что видимая кнопка, та, которую я хочу, является элементом [5]. На самом деле, похоже, что мой цепной поиск не сделал то, что я думал. 2 поиска ниже возвращают разные адреса для найденных объектов, но в любом случае это элемент [5], который отображается на кнопку Отправить в отображаемой форме

>>> login.first.find_by_text('Submit')
[<splinter.driver.webdriver.WebDriverElement object at 0x03320FF0>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD170>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD1B0>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD210>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD250>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD290>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD2D0>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD310>]
>>> browser.find_by_text('Submit')
[<splinter.driver.webdriver.WebDriverElement object at 0x0326CEB0>, <splinter.driver.webdriver.WebDriverElement object at 0x0326C590>, <splinter.driver.webdriver.WebDriverElement object at 0x033200F0>, <splinter.driver.webdriver.WebDriverElement object at 0x033209B0>, <splinter.driver.webdriver.WebDriverElement object at 0x033201B0>, <splinter.driver.webdriver.WebDriverElement object at 0x03320190>, <splinter.driver.webdriver.WebDriverElement object at 0x033207D0>, <splinter.driver.webdriver.WebDriverElement object at 0x033AD350>]

Поэтому мой вопрос: почему цепочечный поиск не возвращает потомка "userLogin", а мне нужна кнопка "Отправить"?

1 ответ

Причина, вероятно, в том, что он не является прямым потомком объекта, который вы найдете с помощью этого идентификатора.

В качестве альтернативы вы можете найти с помощью Xpath, используя Absolute Xpath, или попробовать использовать объект непосредственно над ним в DOM.

Другие вопросы по тегам