【问题标题】:selenium - clicking on radio button generated by javascriptselenium - 单击由 javascript 生成的单选按钮
【发布时间】:2015-08-31 07:08:11
【问题描述】:

我的代码是用 Java 编写的。

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

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

线程“主”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?

请帮助我。

已关闭:我已使用 隐式等待 来等待我的 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();

【问题讨论】:

  • 请阅读:stackoverflow.com/help/how-to-ask 并相应地编辑您的答案,如果您不提供一些您尝试过但失败的代码,没有人可以帮助您
  • 请务必提供您尝试过但失败的代码。但是,根据我的知识,我提供了一个答案。希望对您有所帮助。

标签: javascript java selenium selenium-webdriver


【解决方案1】:

点击动态元素的最佳方式是等待它出现。在 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 中的时间提供超时。希望这会有所帮助。

【讨论】:

  • 预期条件是什么意思?如何在预期条件下编码?可以举个例子吗?
  • 您是否遇到任何错误?我已经更新了与 selenium 链接的预期条件的答案。您无需对其进行编码。它是一个内置的 selenium 类,您可以使用它检查元素的可见性。
  • erm..我想我定位元素的方式是错误的。我仍然无法找到元素。
  • 如何指向使用单选按钮索引生成的第一个单选按钮?
  • 用您的元素定位器@zero 更新了答案。有很多方法可以定位元素。 Check this out.
【解决方案2】:

我会将所有与运输方式对应的INPUTs 拉到集合methods 中,然后单击我想要的那个。示例代码如下。

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

【讨论】:

  • 太棒了。如果此答案解决了您的问题,请接受它作为答案。谢谢!
猜你喜欢
  • 2019-03-17
  • 2021-07-15
  • 2021-09-03
  • 2011-09-27
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多