выбрав раскрывающийся список в htmlunit - PullRequest
2 голосов
/ 20 марта 2011

Я использую htmlunit в jython, и у меня возникают проблемы при выборе раскрывающейся ссылки. На странице, на которую я собираюсь попасть, есть таблица с другими ссылками ajax, и я могу нажимать на них и перемещаться, и это кажется нормальным, но я не могу понять, как щелкнуть раскрывающееся меню, в котором можно найти больше ссылок на страница (это раскрытие влияет на таблицу ajax, поэтому оно не перенаправляет меня или что-либо еще).

Вот мой код:

    selectField1 = page.getElementById("pageNumSelection")
options2 = selectField1.getOptions()
theOption3 = options2[4]

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

MoreOnPage = selectField1.setSelectedAttribute(theOption3, True)

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

Чтобы сделать это немного проще, я использовал скрипт htmlunit и получил некоторый код, который должен работать, но с его Java, и я не уверен, как перенести его на Jython. Вот оно:

 try
      {
           page = webClient.getPage( url );

           HtmlSelect selectField1 = (HtmlSelect) page.getElementById("pageNumSelection");
           List<HtmlOption> options2 = selectField1.getOptions();
           HtmlOption theOption3 = null;
           for(HtmlOption option: options2)
           {
                if(option.getText().equals("100") )
                {
                     theOption3 = option;
                     break;
                }
           }
           selectField1.setSelectedAttribute(theOption3, true );

Ответы [ 4 ]

3 голосов
/ 28 марта 2011

Посмотрите на HtmlForm getSelectedByName

HtmlSelect htmlSelect = form.getSelectByName ("stuff [1] .type");

HtmlOption htmlOption =htmlSelect.getOption (3);

htmlOption.setSelected (true);

2 голосов
/ 27 марта 2011

Убедитесь, что WebClient.setJavaScriptEnabled вызван. В документации, похоже, указано, что она включена по умолчанию, но я думаю, что это неправильно.

В качестве альтернативы вы можете использовать WebDriver , который является платформой, которая поддерживает HtmlUnit и Selenium. Лично я нахожу синтаксис более простым, чем HtmlUnit.

1 голос
/ 29 марта 2011

Если я правильно понимаю, выбор опции в поле выбора инициирует вызовы AJAX, которые после завершения изменяют некоторую часть страницы.

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

HtmlUnit имеет класс с именем NicelyResynchronizingAjaxController, которыйВы можете передать экземпляр методу setAjaxController WebClient.Как указано в javadoc, использование этого контроллера ajax автоматически сделает асинхронные вызовы, поступающие от прямого взаимодействия с пользователем, синхронными, а не асинхронными.После вызова метода setSelectedAttribute вы сможете увидеть изменения, внесенные на исходную страницу.

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

0 голосов
/ 24 марта 2011

Это на самом деле не ответ на вопрос, потому что я раньше не использовал HtmlUnit, но вы можете взглянуть на Selenium и, в частности, Selenium RC . С Selenium RC вы можете контролировать взаимодействие со страницей, отображаемой в собственном браузере (например, Firefox). Он имеет API разработчика для Java и Python среди прочих.

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

...