Select an option using Hound

Hello everyone,

I’m trying to automating navigation using Hound, but I’m having some troubles with select/option elements and how to interact with them.

For instance, I tried in different ways to select an option from the site "https://www.imovelweb.com.br/."

I tried the solution below but didn’t work.

I’m using the selenium driver with the chrome browser.

$ brew install selenium-server-standalone
$ selenium-server -port 4444
use Mix.Config

config :hound,
  driver: "selenium",
  browser: "chrome"

I tried to select in the following ways:

def search() do
    Hound.start_session()

    navigate_to(@url)

    find_element(:css, "#operationType option[value='1']")
    |> click

    #take_screenshot()

  rescue
    e ->
      IO.inspect(e)
      :notfound
  after
    Hound.end_session
  end

Error

%RuntimeError{
  message: "element not interactable: Element is not currently visible and may not be manipulated\n  (Session info: chrome=79.0.3945.88)\nBuild info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'\nSystem info: host: 'Rodrigos-MacBook-Pro.local', ip: '2804:14c:4a:9f9d:1591:2820:1fe7:d763', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.2', java.version: '1.8.0_131'\nDriver info: driver.version: unknown"
}
def search() do
    Hound.start_session()

    navigate_to(@url)

    find_element(:css, "#operationType")
    |> find_within_element(:css, "option[value='1']")
    |> click

    #take_screenshot()

  rescue
    e ->
      IO.inspect(e)
      :notfound
  after
    Hound.end_session
  end

Error

%RuntimeError{
  message: "element not interactable: Element is not currently visible and may not be manipulated\n  (Session info: chrome=79.0.3945.88)\nBuild info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'\nSystem info: host: 'Rodrigos-MacBook-Pro.local', ip: '2804:14c:4a:9f9d:1591:2820:1fe7:d763', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.2', java.version: '1.8.0_131'\nDriver info: driver.version: unknown"
}

I was wondering if I have to click on the select element before to show the options and then click on the chosen option, but when I tried to click on the select element I got another error.

def search() do
    Hound.start_session()

    navigate_to(@url)

    find_element(:css, "#operationType")
    |> click

    #take_screenshot()

  rescue
    e ->
      IO.inspect(e)
      :notfound
  after
    Hound.end_session
  end

Error

%RuntimeError{
  message: "element not interactable\n  (Session info: chrome=79.0.3945.88)\nBuild info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'\nSystem info: host: 'Rodrigos-MacBook-Pro.local', ip: '2804:14c:4a:9f9d:1591:2820:1fe7:d763', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.2', java.version: '1.8.0_131'\nDriver info: driver.version: unknown"
}

Thanks!

1 Like

I don’t see this in your code

use Hound.Helpers
hound_session()

This is what I am using to test by following this book https://shankardevy.com/phoenix-inside-out-mpf/ . But it uses phantomjs

Also if you use Linux install phantomjs like this Problem with acceptance test in hound not starting server on port 4001

Update found this in my tests, it might be similar with what you need:

find_element(:css, "#registration_residence_area option[value='Area 1']")
    |> click

I’m using hound to get some informations from a website, not for test purposes, sorry about my tag test, it’s not the case.

My module contains use Hound.Helpers, I think that hound_session() is used just in test cases to setup the session in the setup method.

I tried using PhantomJS too, in this case, I did not even make it select the option. When I inspected the HTML, the option values were blank. It’s weird, I know, so I changed the code to use the Selenium.

I’m starting and finishing the session in the method.

Below is the whole module.

defmodule PropertyCrawler.Imovelweb do
  use Hound.Helpers

  @url "https://www.imovelweb.com.br/"

  def search() do
    Hound.start_session()

    navigate_to(@url)

    find_element(:css, "#operationType option[value='1']")
    |> click

    #take_screenshot()

  rescue
    e ->
      IO.inspect(e)
      :notfound
  after
    Hound.end_session
  end

end

To use phantomjs you need to run this phantomjs --wd in a terminal window and at the same time in a new window your mix phx.server

That should work. If it doesn’t I really don’t know what is happening.

Are you trying to extract something from a webpage?

If so then HTTPoison(https://github.com/edgurgel/httpoison) might be a better option and this https://github.com/philss/floki

The idea is to use navigation with Hound to filter some data filling the form and after that to use Floki to parse data.

With PhantonJS I cannot find the element, executing the same find_element I got the error below.

%Hound.NoSuchElementError{
  parent: nil,
  selector: "#operationType option[value='1']",
  strategy: :css
}

Inspecting the #operationType element with PhantonJS I saw that all options had blank values.

<select name="" id="operationType">
  <option value="" selected="">Comprar</option>
  <option value="">Alugar</option>
  <option value="">Imóvel Novo</option>
  <option value="">Comercial</option>
  <option value="">Temporada</option>
</select>

This is strange have you tried to extract just an h1 tag to see if hound is working?

Yes, I can get h1 tag.

...
  find_element(:css, "h1")
  |> outer_html
...

Result:

iex(1)> PropertyCrawler.Imovelweb.search
"<h1>Você muda, <b>sua vida muda</b></h1>"

OK then how about writing your select like this:

<%= select f, :category_id, Enum.map(@categories, &{&1.name, &1.id}), prompt: "Choose a category" %>

If this doesn’t work either then try to create a minimal example only with a slect and test hound on that to see if that works.
If it does then you most certenly have a problem in your actual code or a bug.