WebDriver PhantomJS无法找到元素,但可以在Firefox中正常使用

时间:2014-11-04 18:07:56

标签: java selenium selenium-webdriver webdriver phantomjs

我已经把头撞到墙上很长一段时间所以我想我会问“专家”为什么下面的代码不能用PhantomJS工作(输入密码)但用Firefox工作得很好。最令人不安的是,一个字段条目(用户名)成功,但第二个根本不起作用。该页面加载得很好,我已经包含了测试代码,以验证其他组件是否正常加载。

见下面的代码:

import java.io.File;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;

public class login {

public static void main(String[] args) {
    WebDriver driver;
    Boolean verbose = false;  //Change to true to test it with firefox
    String phantomPath = "../phantomjs-1.9.8-linux-i686/bin/phantomjs";
    String url = "https://www.britishairways.com/travel/redeem/execclub/_gf/en_us";

    if (verbose) {
         driver = new FirefoxDriver();
         }
    else{
        File file = new File(phantomPath);
        String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8";
        System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
        System.setProperty("phantomjs.page.settings.userAgent", userAgent);

        driver = new PhantomJSDriver();
        }
    driver.get(url);
    try{
        driver.findElement(By.id("membershipNumber")).sendKeys("1234");
        System.out.println("ID input successful");
        if (driver.findElement(By.id("ecuserlogbutton")).isDisplayed()) {
            System.out.println("Login Button is present");
        }
        //This is where it fails with PhantomJS but work with Firefox
        driver.findElement(By.cssSelector("#pintr > #password")).sendKeys("1234");          
        System.out.println("password input successful");
        }
    catch (Exception e){
        System.out.print(e.getMessage());
        }
    driver.close();
}
}

2 个答案:

答案 0 :(得分:8)

PhantomJS 1.x有元素ID问题。该网站已损坏,因为它使用password页面上的两个元素,这些元素永远不会发生。只需用元素类型(input)替换选择器中的id就可以解决它。

driver.findElement(By.cssSelector("#pintr > input")).sendKeys("1234");

答案 1 :(得分:1)

Try the methods from this link

根据我对WebDriver的经验,通常是时间问题。在代码开头调用上面链接中的方法,以便在尝试查找之前确保所有内容都已加载。或者你可以在找到元素之前使用Thread.Sleep足够长的时间。