selenium - 点击javascript生成的单选按钮

时间:2015-08-31 07:08:12

标签: javascript java selenium selenium-webdriver

我的代码是用Java编写的。

我有一组由javascript动态生成的单选按钮。 我想点击其中一个。

我使用xpath但它不起作用。 它说

  

线程“main”中的异常org.openqa.selenium.NoSuchElementException:   无法找到元素:

我在谷歌浏览器上“检查元素”之后尝试了下面的两种deliveryType方法。

 //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跟随“检查元素”和“查看页面源”。 两者都给我同样的错误,因为没有找到这样的元素。

如何让我的selenium脚本点击其中一个由javascript动态生成的单选按钮?

我的xpath应该指向原始javascript编码或窗口加载后javascript生成的html?

请帮助我。

  

已关闭:我已使用 Implict Wait 等待我的javascript运行并加载我的html。加载后,我使用List来存储我的所有单选按钮。从列表中,我通过索引得到它。

感谢Girish Sortur&amp; JeffC。

以下是我的代码。

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

2 个答案:

答案 0 :(得分: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中显示的时间元素提供超时。希望这会有所帮助。

答案 1 :(得分:1)

我会将对应于送货方式的所有INPUT拉到集合methods中,然后点击我想要的那个。示例代码如下。

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