Java - Selenium Firefox驱动程序 - 无法点击iframe

时间:2017-08-29 05:45:13

标签: java selenium iframe selenium-firefoxdriver

非常感谢任何帮助。

我希望我的程序登录到really.ca(只要你输入正确的用户凭据,这是有效的),导航到特定的职位发布(工作),点击第一个橙色申请按钮(工作), iframe弹出。

然后我想点击出现的iframe中的蓝色应用按钮。 "申请不同的简历?"链接(如果你没有登录,确实你不会看到这个。)

如果您没有真正的帐户,并希望提供帮助,只需点击弹出式iframe中的任何链接即可。示例:尝试单击"立即创建一个"链路

下面的代码工作了两周,但现在似乎Indeed.ca对网站做了一个小改动,代码被破坏了

import java.io.IOException;
import java.util.ArrayList;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;


public class Test {
//IOException, InterruptedException, NoSuchElementException 

    public static void main(String[] args) throws IOException, InterruptedException, NoSuchElementException {

        System.setProperty("webdriver.gecko.driver", "C:\\Users\\Padoga\\Documents\\geckodriver-v0.18.0-win64\\geckodriver.exe");

        try {

        FirefoxDriver driver = new FirefoxDriver();

        driver.get("https://secure.indeed.com/account/login?service=my&hl=en_CA&co=CA");
        driver.findElement(By.xpath("//*[@id=\"signin_email\"]")).sendKeys("youremail@email.com");
        driver.findElement(By.xpath("//*[@id=\"signin_password\"]")).sendKeys("password");
        driver.findElement(By.xpath("//*[@id=\"loginform\"]/button")).click();  





        driver.navigate().to("https://ca.indeed.com/viewjob?jk=ff97666702741fef&q=marketing&l=Toronto%2C+ON&tk=1boluh7om5igq9ng&from=web");
//      int size = driver.findElements(By.tagName("iframe")).size();
//      System.out.println(size);
        Thread.sleep(3000);
        //click orange "apply now" button
        driver.findElement(By.xpath("//*[@id=\"apply-state-picker-container\"]/div[1]/span[1]")).click();

        Thread.sleep(3000);

        //don't believe this is working now - below used to switch to correct pop-up iframe
        driver.switchTo().frame(1);
        driver.switchTo().frame(0);

        //not working anymore -- click "apply with a different resume?" link
        driver.findElement(By.xpath("\"//*[@id=\\\"form_container\\\"]/div[2]/div[1]/div[1]/p/a\"")).click();

        //no longer reach below steps
        //click on resume "choose file" button and upload resume
        driver.findElement(By.id("resume")).sendKeys("C:\\Users\\Padoga\\resumes\\Resume.pdf");
        //click blue apply button
        driver.findElement(By.id("apply-div")).click();
        }
        catch(Exception e){
            //System.out.println(e.getMessage());
        }

//      driver.quit();

    }

}

2 个答案:

答案 0 :(得分:0)

您需要先切换以执行iframe元素中的任何操作

切换到元素的代码是: -

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select name="lab_no" id="lab-no" class="form-control">
  <option value="Lab 01" >Lab 01</option>
  <option value="Lab 02">Lab 02</option>
</select>

在上面的代码中,0是一个索引。因此它会将控制权转移到DOM中的第一个iframe。您可能需要更改索引1,2,...等等。还有另一个参数也可以切换到没有索引的帧

基本上,我们可以使用3种方式切换帧中的元素。

  • 按索引
  • 按姓名
  • Id By Web Element

有关详情,请参阅以下网址

http://toolsqa.com/selenium-webdriver/handling-iframes-using-selenium-webdriver/

https://www.guru99.com/handling-iframes-selenium.html

希望它会对你有所帮助:)。

答案 1 :(得分:0)

尝试使用以下代码,看看它是否适合您 -

driver.switchTo().frame("page_frame");
driver.findElement(By.xpath("//*[@id="form_container"]/div[2]/div[1]/div[1]/p/a")).click();

更新 -

driver.switchTo().frame("indeedapply-modal-preload-iframe");
driver.findElement(By.xpath("//*[@id="form_container"]/div[2]/div[1]/div[1]/p/a")).click();

更新2 -

我在另一个iframe中找到了一个iframe。所以,首先你需要切换到外部iframe然后切换到内部iframe,然后切换到元素。

可能的解决方案 -

driver.switchTo().frame("indeedapply-modal-preload-iframe");
driver.switchTo().frame(0);
driver.findElement(By.xpath("//*[@id="form_container"]/div[2]/div[1]/div[1]/p/a")).click();

OR

driver.switchTo().frame(0);
driver.switchTo().frame(0);
driver.findElement(By.xpath("//*[@id="form_container"]/div[2]/div[1]/div[1]/p/a")).click();