2017-09-16 822 views
0

嗨,大家好,所以我是一个亲戚(阅读:完整)新手Selenium/Java/HTML所以道歉,如果我问明显。 我需要的是能够Selenium无法点击特定复选框

  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(); 

点击股利而不是

driver.findElement(By.xpath("//*[@id='agree_to_terms_label']/input")).click(); 
内的HREF超链接

元素不可见

CSS:

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

元素不可见

by.className:

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

打开超链接

我周围的论坛看看并看到提及元素被隐藏起来 - 但是我无法找到任何内嵌框架或其他任何看起来隐藏了bug子手的东西?

任何帮助将不胜感激!

+0

请检查是否是帧 – iamsankalp89

+0

您好我查了框架,但它并不像有一个。现在看来似乎不是另一个原因(这我还不知道)可见 – KZNKatana

+0

ü可以分享网址 – iamsankalp89

回答

0

尝试以下操作:

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(); 

UPDATE:

或尝试如下使用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 ); 
+0

由于只是尝试这样做: @And(“^检查相关盒$”) \t公共无效()。)()。()。)标签[@ id ='agree_to_terms_label']“))。click();您可以使用WebElement yourChkBox = driver.findElement(By.xpath(“// * [@ id ='agree_to_terms_join']/parent :: label”)); \t \t WebDriverWait等待=新WebDriverWait(驱动程序,60); wait.until(ExpectedConditions.visibilityOf(yourChkBox)); \t \t Actions act = new Actions(driver); 。act.moveToElement(yourChkBox)。单击()建立()执行(); \t \t \t} – KZNKatana

+0

但我仍然不能点击复选框 - 超链接保持打开。不知道我做错了什么! – KZNKatana

+0

@KZNKatana:尝试更新我与你的代码,而不是使用这部分 – kushal

0

试试这个:

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(); 

如果需要放隐性或显性的等待

+0

我只是尝试过那些 - 没有运气我害怕:( – KZNKatana

+0

等待我会尝试 – iamsankalp89

+0

试过了,但它打开了该div类中的超链接,而我试图仅选择复选框...我也尝试让webdriver等待并且它仍然没有找到元素我是否做错了什么? – KZNKatana

1

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

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

你是一个绝对的明星 - 这个作品!但是,在web html中有两个.left-block类 - 你知道我怎么可以让Selenium指定我想要的?因此,例如,我想特定复选框1(在我原来的问题)被选中* only *,但不是复选框2(如果这有道理?) – KZNKatana

+0

谢谢你。您始终可以指定索引。就像'WebElement element1 = driver.findElement(By.cssSelector(“。left-block”)[Index]);'索引将从1开始 – Kapil

+0

好的工作亲爱的:)) – iamsankalp89