如何使用Selenium处理HTML源中不存在的搜索栏?

时间:2014-01-03 03:43:00

标签: java html selenium selenium-webdriver

我正在尝试使用Selenium(Java)来自动执行某些搜索。

当我转到该页面并单击搜索栏上的Inspect Element时,我发现它具有ID searchBox和名称q,这两个都可能有用。然而,当我转到View Source时,这些属性在HTML中找不到。

当我尝试使用

WebElement search = driver.findElement(By.id("searchBox"));

WebElement search = driver.findElement(By.name("q"));

两人都回来了,因为无法找到。

如果我找不到其中任何一个元素,如何继续填充搜索字段然后点击提交(源页面中也缺少提交按钮)?

修改

根据要求,这里有一个更详细的错误图片:

  1. WebDriver访问的网页网址为http://www.ycharts.com,使用

    driver.get("http://www.ycharts.com/login");
    

    如果您使用实际的网络浏览器访问此页面,请右键单击搜索栏并选择“检查元素”,您将看到其ID为“searchBox”且其名称为“q”。但是,如果您去查看同一页面的源代码,您会发现HTML中没有这样的元素。显然,这就是WebDriver无法找到它的原因。

  2. driver启动如下:

    WebDriver driver = new HtmlUnitDriver();
    
  3. 当我尝试像

    这样的东西时
    WebElement search = driver.findElement(By.id("searchBox"));`
    

    返回的异常是:

    Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with ID: searchBox
    
  4. 所以,回到最初的问题:显然,元素存在,但它不在HTML中 - 你如何与它互动?

1 个答案:

答案 0 :(得分:2)

问题是由于javascript将搜索框添加到html帖子页面加载的事实。

http://ycharts.com/返回的HTML不包含搜索框,因此当Selenium认为页面已完成加载(即DOM就绪状态)时,没有搜索框。

为了与搜索框进行交互,您需要告诉Selenium等待该框出现在DOM中。

实现这一目标的最简单方法是使用WebDriverWait;

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));