2015-01-05 4 views
1

Ошибки является:Селена, Выбор элемента внутри <span>

Select only works on <select> elements, not on <span>. Trying to accomplish this using PhantomJS & Selenium in Python. 

Ближайшим Я пришел, возможно, найти ответ заключается в следующем:

How can i select this span element?

Пытаясь узнать автоматизации Selenium , и вычисляемая работа с Gmail была бы серьезной проблемой. Сейчас мы пытаемся выбрать «Месяц рождения» на этапе создания учетной записи.

https://accounts.google.com/SignUp?service=mail&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&ltmpl=default&hl=en

Прямо сейчас, пытаясь выбрать по XPath, следующим образом (и то, что приводит к ошибке выше).

select_birthday_month = Select(driver.find_element_by_xpath('//span[@id="BirthMonth"]') 

код на странице Gmail является:

<div class="form-element multi-field birthday" id="birthday-form-element"> 
    <fieldset> 
    <legend><strong id="BirthdayLabel">Birthday</strong></legend> 
    <label id="month-label" class="month"> 
    <span id="BirthMonthHolder" > 
    <select id="BirthMonth" name="BirthMonth"> 
    <option value="">Month</option> 
    <option value="01" > 
    January</option> 
    <option value="02" > 
    February</option> 
    <option value="03" > 
    March</option> 
    <option value="04" > 
    April</option> 
    <option value="05" > 
    May</option> 
    <option value="06" > 
    June</option> 
    <option value="07" > 
    July</option> 
    <option value="08" > 
    August</option> 
    <option value="09" > 
    September</option> 
    <option value="10" > 
    October</option> 
    <option value="11" > 
    November</option> 
    <option value="12" > 
    December</option> 
    </select> 
    </span> 
    </label> 

Я попытался:

select_birthday_month = driver.find_element_by_xpath('//span[@id="BirthMonth"].click() 

(как и некоторые другие ответы StackOverflow предложили при столкновении с этой проблемой). Затем выберите x-путь для значения месяца. Но я получаю ошибку, в которой говорится, что x-path для этого не может быть найден.

Может ли кто-нибудь предложить лучший способ сделать это? Нужно ли сначала щелкнуть элемент? Есть ли хороший способ получить «хитрые» x-пути? Правый щелчок/проверка элемента на хром работает для основных вещей, но при попадании в выпадающие списки - это не разрезает его.

ответ

1

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

Однако, есть решение, сначала проверьте, что элемент, как Google визуализацию HTML выберите вариант, он показывает что-то вроде этого:

<span aria-invalid="false" class=" " id="BirthMonth"> 
<div aria-activedescendant=":0" title="Birthday" aria-haspopup="true" tabindex="0" aria-expanded="false" style="-moz-user-select: none;" role="listbox" class="goog-inline-block goog-flat-menu-button jfk-select"> 
<div aria-posinset="3" aria-setsize="12" role="option" id=":0" class="goog-inline-block goog-flat-menu-button-caption">March</div> 
<div aria-hidden="true" class="goog-inline-block goog-flat-menu-button-dropdown">&nbsp;</div></div><div aria-haspopup="true" role="listbox" style="-moz-user-select: none; visibility: visible; left: 0px; top: -204px; display: none;" class="goog-menu goog-menu-vertical"><div id=":1" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">January</div></div><div id=":2" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">February</div></div><div id=":3" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">March</div></div><div id=":4" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">April</div></div><div id=":5" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">May</div></div><div id=":6" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">June</div></div><div id=":7" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">July</div></div><div id=":8" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">August</div></div><div id=":9" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">September</div></div><div id=":a" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">October</div></div><div id=":b" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">November</div></div><div id=":c" style="-moz-user-select: none;" role="option" class="goog-menuitem"><div class="goog-menuitem-content">December</div></div></div><input value="03" id="HiddenBirthMonth" name="BirthMonth" type="hidden"></span> 
... and the rest ... 

Google Оказал нормальный вариант в различные динамические дивов под пядь элемент, вы не смогли бы ВыбратьДИВ или диапазона, так что вы должны думать альтернативу.

Который, к счастью, что динамический ДИВ имеет классы, называемые goog-inline-block goog-flat-menu-button jfk-select, вам нужно только найти этот элемент и посылать ключи имитировать действие Выбрать < - Я имею в виду, посылая набрав ключей.

Хорошо, вот рабочий раствор:

... 
# I find the div by class_name, of course you can use xpath 
select_birthday_month = driver.find_element_by_class_name('jfk-select') 
select_birthday_month.send_keys('January') 
... 

Вот так!Иногда вам просто нужно думать вне коробки, чтобы решать подобные вопросы, я надеюсь, что это помогает :)

Смотрите результат:

enter image description here

+0

Я никогда не считал отправки ключей для выбора. Удивительная идея, поможет мне в будущем с другими проблемами. Спасибо что нашли время ответить! – brizz

+0

Вы знаете, как я могу это сделать в javascript (или с jquery)? – arieljannai

+0

@arieljannai, да, вы можете использовать 'driver.execute_script ('...')' вы можете запустить jquery, если он находится в области. Взгляните на их документы [здесь] (http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.execute_script) – Anzel