【问题标题】:Selenium Can't Click Specific CheckboxSelenium 无法单击特定复选框
【发布时间】:2017-09-16 23:00:46
【问题描述】:

大家好,好吧,所以我是 Selenium / Java / HTML 的相对(阅读:完整)新手,如果我问的很明显,我深表歉意。 我需要的是能够

  1. 单击特定复选框 1 和
  2. 如果选中了特定复选框 2,则取消选中它

这是网站 HTML:

特定复选框 1

<div class="checkbox">
    <label id="agree_to_terms_label" for="agree_to_terms_join" class="visible">
      <input id="agree_to_terms_join" name="agree_to_terms" type="checkbox" data-required="true" data-required-message="You need to agree to the *** Account Holder agreement" data-change="" class="parsley-validated">
      <span class="left-block"></span>
      I have read, understand and agree to the <a href="/terms-and-conditions/" target="_blank">*** Account Holder Agreement</a>
      and acknowledge <a href="/privacy-policy" target="_blank">*** Privacy Policy</a>
      <input type="hidden" name="agree_to_terms" value="yes">
    </label>
  </div>

特定复选框 2:

<div class="checkbox">
    <label id="agree_to_offers_label" for="agree_to_offers" class="visible">
      <span class="left-block">
         <input id="agree_to_offers" name="agree_to_offers" type="checkbox" data-required-message="" data-change="" checked="checked" value="yes">
        <span>By joining *** you'll be notified of exclusive offers and account updates via email</span>
      </span>
    </label>
  </div>

我徒劳的尝试:

Xpath:

driver.findElement(By.xpath("//input[@id='agree_to_terms_join' and @type='checkbox']")).click();

元素不可见

driver.findElement(By.xpath("//*[@id='agree_to_terms_join']/parent::label")).click();

改为点击 div 中的 href 超链接

driver.findElement(By.xpath("//*[@id='agree_to_terms_label']/input")).click();

元素不可见

CSS:

driver.findElement(By.cssSelector("input[id = 'agree_to_terms_join'][type = 'checkbox']")).click();

元素不可见

by.className:

driver.findElement(By.className("checkbox")).click();

打开超链接

我浏览了论坛并看到提到的元素被隐藏了 - 但是我找不到任何 iframe 或任何其他似乎隐藏了窃听器的东西?

任何帮助将不胜感激!

【问题讨论】:

  • 请检查是否是frame
  • 您好,我检查了一个框架,但看起来没有。似乎由于其他原因它不可见(我还不知道)
  • 你能分享网址吗
  • 尝试使用 id Dear

标签: java html selenium xpath checkbox


【解决方案1】:

您要点击的确切元素是“::before”,它是一个伪元素。我认为您需要使用Javascript。下面的代码应该适合你

WebElement element1 = driver.findElement(By.cssSelector(".left-block"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element1);

【讨论】:

  • 你是绝对的明星——这行得通!但是,web html 中有两个 .left-block 类 - 你知道我如何让 Selenium 指定我想要的吗?因此,例如,我希望仅选择特定复选框 1(在我的原始问题中),而不选择复选框 2(如果这有意义?)
  • 谢谢哥们。您始终可以指定索引。像WebElement element1 = driver.findElement(By.cssSelector(".left-block")[Index]); 这样的索引将从 1 开始
【解决方案2】:

尝试以下:

WebElement yourChkBox  = driver.findElement(By.xpath("//*[@id='agree_to_terms_join']/parent::label"));

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOf(yourChkBox));

Actions act = new Actions(driver);
act.moveToElement(yourChkBox).click().build().perform();

更新:

或尝试使用 javascriptexecutor 如下:

WebElement yourChkBox  = driver.findElement(By.xpath("//*[@id='agree_to_terms_join']/parent::label"));

JavascriptExecutor js = (JavascriptExecutor) driver;        
js.executeScript("arguments[0].setAttribute('value', 'Yes');", yourChkBox  );

【讨论】:

  • 谢谢刚刚试过这个:@And ("^Checks related boxes$") public void checksBoxes() { //driver.findElement(By.xpath(".//label[@id='同意_to_terms_label']")).click(); WebElement yourChkBox = driver.findElement(By.xpath("//*[@id='agree_to_terms_join']/parent::label")); WebDriverWait 等待 = 新的 WebDriverWait(驱动程序, 60); wait.until(ExpectedConditions.visibilityOf(yourChkBox));动作动作 = 新动作(驱动程序); act.moveToElement(yourChkBox).click().build().perform(); }
  • 但我仍然无法点击复选框 - 超链接一直在打开。不知道我做错了什么!
  • 我在你的代码中使用了这个:js.executeScript("arguments[0].click();", yourChkBox );它奏效了!非常感谢:)
【解决方案3】:

试试这个:

WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.get("https://www.quidco.com/join-quidco/");          
driver.findElement(By.xpath(".//label[@id='agree_to_terms_label']")).click();         
driver.findElement(By.xpath(".//label[@id='agree_to_offers_label']")).click();

如有必要,隐式或显式等待

【讨论】:

  • 等我试试
  • 试过了,但它打开了那个 div 类中的超链接,而我试图只选择复选框......我也尝试让 webdriver 等待,但它仍然找不到元素。我做错了吗?
  • 您可以点击标签来选择它。请显示你的代码。因为它在我的电脑上工作。它也没有打开超链接。我复制了代码使用它
  • 如果可能,请在问题中复制您的代码。这段代码很简单
  • @And ("^Checks related boxes$") public void checksBoxes() { driver.findElement(By.xpath(".//label[@id='agree_to_terms_label']"))。点击(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2017-06-03
  • 2014-07-29
  • 2019-02-19
  • 2017-09-24
  • 2021-12-11
相关资源
最近更新 更多