Mike Kiewicz Mike Kiewicz - 1 year ago 101
C# Question

C#: Selecting Dropdown Items with Marionette Driver

I am using

Selenium Webdriver
bindings and trying to switch from the old FirefoxDriver (pre-FF 47) to the new
Marionette driver
(FF47 and above) and it's working great after some teething problems that seemed to be fixed with the release of
Selenium 2.53.1
FF 47.0.1

The only problem now is that it seems to have an issue selecting option tags under a select tag. The following code works for all other browsers that I am testing in (FF < 46, Chrome, IE). I am passing the following arguments into my
function. The select
and the text to search for. Here's the function definition:

public static void dropdownSelect(IWebDriver driver, IWebElement inObject, string inText)

I have tried use the
class as I have with all of the other browsers

select = new SelectElement(inObject);

//select the matching element

I've also tried getting a Collection of the option and scrolling through the collection using both

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
ReadOnlyCollection<IWebElement> optDropdown;

optDropdown = inObject.FindElements(By.TagName("option"));

foreach (IWebElement thsItem in optDropdown)
//check for matching text
if (thsItem.Text == inText)
// 1/4 second wait


//exit foreach loop

and a
click in place of the
piece of code

//click option element
js.ExecuteScript("arguments[0].click();", thsItem);

Nothing is ever selected and no error or exception is thrown. It just continues on its merry way without selecting anything

Am I doing something wrong or is this something that is still being worked out with the new Marionette driver?

Answer Source

I figured this out by just using Javascript similar to what was described above. Since there is a dependency on this dropdown when it changes I just selected the appropriate option when it is found in Selenium and fired the onchange even with Javascript

Here's the HTML for the select box

<select class="T2FormControl"   id="ctl00_pageContent_TableList_T2DropDownList_DropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$pageContent$TableList$T2DropDownList$DropDownList\',\'\')', 0)" name="ctl00$pageContent$TableList$T2DropDownList$DropDownList">

And the Javascript that performs the action

//click option element and for change event
js.ExecuteScript("arguments[0].selected = true;" +
                 "var element=arguments[1];" +
                 "var event=document.createEvent(\"HTMLEvents\");" + 
                 "event.initEvent('change', false, true);" +
                 "element.dispatchEvent(event);", thsItem, inObject);

with IWebElement thsItem being the option selected and IWebElement inObject being the select tag for the dropdown

Seems like a roundabout way to do something that the other Selenium drivers do automatically, but it works