Хобрук: Ваш путь к мастерству в программировании

Selenium HtmlUnitDriver Войти на сайт

Я пытаюсь использовать HtmlUnitDriver для входа на marketwatch.com. Я не думаю, что программа когда-либо обходит запрос на вход в систему, и я проверил, что у меня правильный адрес электронной почты и пароль...
Большое спасибо за попытку помочь мне!
Вот мой закомментированный код:

static Logger log = Logger.getLogger("com.gargoylesoftware");
    public static void main(String[] args) throws InterruptedException {
        log.setLevel(Level.OFF);
        // Create a new instance of the html unit driver
        WebDriver driver = new HtmlUnitDriver();
        // Go to marketwatch
        driver.get("http://www.marketwatch.com/game/");
        System.out.println(driver.getTitle()); // prints 'Virtual Stock Exchange Games (VSE) - MarketWatch.com'
        // Click on 'login'
        WebElement login = driver.findElement(By.id("profilelogin"));
        login.click();
        System.out.println(driver.getTitle()); // prints 'Log In'
        // Enter username and password
        WebElement email = driver.findElement(By.id("username"));
        email.sendKeys(Ref.EMAIL);
        WebElement pass = driver.findElement(By.id("password"));
        pass.sendKeys(Ref.PASSWORD);
        // Click submit button
        WebElement submit = driver.findElement(By.id("submitButton"));
        submit.click();
        System.out.println(driver.getTitle()); // prints 'Log In' (same title as before we tried to log in)
        // Try to find 
        WebElement game = driver.findElement(By.xpath("//*[@id='maincontent']/section[1]/table/tbody/tr[1]/td[1]/a"));
        // This gets printed to console:
        // Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate a node using //*[@id='maincontent']/section[1]/table/tbody/tr[1]/td[1]/a
        // I don't think it's ever getting past the login screen...
        // You don't really have to read past this, unless you think I might've messed something else up and you want to fix it.
        game.click();
        WebElement trade = driver.findElement(By.xpath("//*[@id='vse-nav']/ul/li[2]/a"));
        trade.click();
        WebElement searchBar = driver.findElement(By.className("instrumentsearch ac_input unused"));
        searchBar.sendKeys("GOOG");
        searchBar.submit();
        System.out.println(driver.getTitle());

        driver.quit();
    }

Ответы:


1

Попробуйте включить javascript, он нужен сайту:

    // Create a new instance of the html unit driver
    WebDriver driver = new HtmlUnitDriver(true);

Вы также можете включить JavaScript, выполнив следующие действия:

    driver.setJavascriptEnabled(true);
18.11.2016
  • Это своего рода старый пост, но я думаю, что помню, что это решение. Спасибо! 18.11.2016

  • 2

    После вашего submit.click() вы можете сделать дамп текущего DOM браузера, подключенного к селену, который вы можете изучить, чтобы определить, с чем на самом деле сталкивается Selenium. Выполнение этого с помощью следующего кода может позволить вам просмотреть любые применимые сообщения об ошибках... может быть, например, есть ошибка, указывающая, что роботам не разрешен доступ к сайту.

    System.out.println(driver.getPageSource());
    
    10.01.2016
  • Что бы я искал в источнике страницы, чтобы сказать мне, что происходит не так? 10.01.2016
  • Глядя на это. Тем временем вы можете удалить свой пароль из связанного поста в строке 91. Я не буду пытаться войти с его помощью, но подтверждаю, что он соответствует ожиданиям. 10.01.2016
  • О, я не знал, что мой пароль был там. Большое спасибо, что указали на это! 10.01.2016
  • Первые мысли: поскольку вставленный DOM извлекается после нажатия кнопки «Отправить», я бы не ожидал, что он будет содержать заполненную информацию для имени пользователя и пароля, которые содержит ваша вставка. Из-за этого я подозреваю, что представление не произошло. Возможно, этого не происходит, возможно, это просто то, что мы слишком быстро извлекли информацию (после нажатия кнопки отправки, но до фактического обновления. Я предлагаю вам дождаться устаревания кнопки отправки, прежде чем запускать getPageSource() и затем пересмотреть. 10.01.2016
  • Вы говорите мне сделать что-то вроде «Thread.sleep(5000);» или есть какая-то проверка на устаревание? Я пока подожду 5 секунд... 10.01.2016
  • (псевдокод) Чтобы дождаться устаревания, вы можете использовать: WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(ExpectedConditions.stalenessOf(submit); System.out.println(driver.getPageSource()); Проверить, не изменилась ли страница. 30-секундного ожидания должно быть достаточно, но может потребоваться его увеличение. Пожалуйста, сообщите, если это произошло помогло. 10.01.2016
  • Хорошо, я попробую 10.01.2016
  • Что касается ожидания и ожидаемых условий, вы можете ознакомиться с ними: seleniumhq.org/ docs/04_webdriver_advanced.jsp selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ 10.01.2016
  • Хорошо, я проверю их... также истекло время ожидания, поэтому я позволю этому продолжаться более 30 секунд, может быть, что-то еще происходит...? Также большое спасибо за лайк, разговор со мной. ты супер полезно 10.01.2016
  • Хорошо, я оставил его на 60 секунд, и время ожидания все равно истекло, вот код pastebin.com/52Tgj848 10.01.2016
  • Если тайм-аут происходит после того, как ему было предоставлено достаточно времени, то есть проблема с отправкой формы. Чтобы обойти это, мы можем попытаться использовать предоставленный Selenium метод .submit(). Это можно вызвать из любого элемента формы. Это означает, что вы можете использовать его в уже указанном пароле WebElement и полностью исключить расположение и нажатие кнопки отправки. Подробности см. в этом вопросе 10.01.2016
  • Код выглядит так, как ожидалось. Попробуйте .submit, упомянутый выше. 10.01.2016
  • Я получил: Исключение в потоке main org.openqa.selenium.WebDriverException: Не удается найти элемент, используемый для отправки формы ------- Я пойду и прочитаю другой вопрос, ха-ха 10.01.2016
  • Кроме того, я вижу, что в DOM установлен флажок «Оставаться в системе». Это означает, что после успешного входа в систему сценарий завершится ошибкой, потому что вы больше не получите страницу входа. Я бы предложил снять отметку с помощью скрипта и всегда входить в систему. ‹тип ввода = имя флажка = идентификатор сохранения входа в систему = отмеченный вход в систему = отмеченный класс = значение регистра_флажка = вкл / › 10.01.2016
  • Что вы имели в виду, сняв галочку с помощью скрипта? Извините, если кажется, что я действительно ничего не знаю... 10.01.2016
  • См. seleniumcodes.blogspot.com/2011/10. / 10.01.2016
  • Хорошо, я добавил это (pastebin.com/UBUT4zAN) прямо перед тем, как мы создали элемент входа. Затем получил исключение NoSuchElementException, когда я попытался его запустить. Не удалось найти что-то с id=savelogin 10.01.2016
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..