2015-08-31 3 views
0

Мой код написан на Java.selenium - нажав на кнопку радио, созданный javascript

У меня есть набор переключателей, которые динамически генерируются javascript. Я хочу нажать на один из них.

Я использую xpath, но он не работает. Это говорит

Исключение в потоке «основного» org.openqa.selenium.NoSuchElementException: Не удалось найти элемент:

Я попробовал оба метода DeliveryType ниже, после того, как я «Осмотреть элементы» на Google хром.

//WebElement deliveryType = driver.findElement(By.xpath("//div[contains(@id, 'checkout-shipping-method-load')]//*[contains(@name, 'shipping_method')]")); 
    //WebElement deliveryType = driver.findElement(By.cssSelector("[name='shipping_method'][id='s_method_matrixrate_matrixrate_5983']")); 
    //deliveryType.click(); 

Ниже приведено проверочное устройство для этой кнопки.

<div id="checkout-shipping-method-load"> 
    <dl class="sp-methods"> 
    <dt>Select Shipping Method</dt> 
    <dd> 
     <ul> 
      <li> 
      <input name="shipping_method" type="radio" value="matrixrate_matrixrate_5983" id="s_method_matrixrate_matrixrate_5983" class="radio validation-passed"> 
<label for="s_method_matrixrate_matrixrate_5983">Standard Shipping<span class="price">NT$300</span></label></li> 
     <li> 
      <input name="shipping_method" type="radio" value="matrixrate_matrixrate_5991" id="s_method_matrixrate_matrixrate_5991" class="radio validation-passed"> 
<label for="s_method_matrixrate_matrixrate_5991">Express Shipping<span class="price">NT$1,200</span></label></li> 
     </ul> 
    </dd> 
    </dl> 
</div> 

Я попытался запрограммировать свой сценарий, чтобы щелкнуть по нему. Я попробовал свой xpath, чтобы следовать «проверять элемент» и «просмотреть источник страницы». Оба дают мне ту же ошибку, что и такой элемент не найден.

Как мне настроить сценарий селена на один из переключателей, которые динамически генерируются javascript?

Мое xpath должно указывать на необработанное кодирование javascript или html, сгенерированное javascript после загрузки окна?

Пожалуйста, помогите мне.

Закрыто: Я использовал неявным Подождите ждать моего JavaScript для запуска и загрузить мой HTML. После загрузки я использовал List для хранения всех моих переключателей. Из списка я получаю его по индексу.

Благодаря Girish Sortur & JeffC.

Ниже приведен мой код.

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
List<WebElement> methods = driver.findElements(By.cssSelector("input[name='shipping_method']")); 
methods.get(0).click(); 
+0

Pls прочитать: http://stackoverflow.com/help/how-to-ask и редактировать свой ответ соответственно, никто не может помочь вам без вас обеспечивая некоторый код, который вы пытались и не – drkthng

+0

Пожалуйста, обеспечивают код, с которым вы пытались и не справились. Однако, исходя из моих знаний, я дал ответ. Надеюсь, поможет. –

ответ

1

Я бы потянул все INPUT s, соответствующие методам доставки, в коллекцию methods, а затем щелкните тот, который я хотел. Пример кода ниже.

List<WebElement> methods = driver.findElements(By.cssSelector("input[name='shipping_method']")); 
methods.get(0).click(); // clicks the first element, Standard Shipping 
+0

Спасибо за помощь !! Проблема решена! – zero

+0

Отлично. Если этот ответ решает вашу проблему, пожалуйста, примите его в качестве ответа. ! – JeffC

2

Лучший способ щелкнуть по динамическому элементу - дождаться его появления. В Selenium вы можете дождаться элемента, пока он не появится, используя метод WebDriverWait(). ExpectedConditions используются в Selenium для проверки ожиданий. Здесь вы можете использовать видимость элемента. Вот пример кода -

WebElement radioBtn = driver.findElement(By.xpath("//input[@id='s_method_matrixrate_matrixrate_5983']")); 
new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOf(radioBtn)); 

Также вы можете попробовать с FluentWait, который является лучшим вариантом ждать элемента появится. Вот как это делается -

new FluentWait<WebElement>(radioBtn). 
    withTimeout(50, TimeUnit.SECONDS). 
    pollingEvery(2,TimeUnit.SECONDS); 

FluentWait ожидает появления элемента с указанными опциями. Опрос проверяет наличие элемента на этом интервале. Предоставление тайм-аута, основанного на элементе времени, требуется для отображения в DOM. Надеюсь это поможет.

+0

Что вы подразумеваете под ожидаемыми условиями? Как мне закодировать в ожидаемых условиях? Можно привести пример? – zero

+0

Вы получаете какие-либо ошибки? Я обновил ответ на ожидаемые условия связи с селеном. Вам не нужно его кодировать. Его встроенный класс селена, с помощью которого вы можете проверить видимость элементов. –

+0

erm..I догадываться, как я обнаруживаю, что мой элемент неправильный. Я все еще не могу найти элемент. – zero

Смежные вопросы