Selenium测试无法在Google反向查找中自动完成

时间:2016-11-25 12:24:10

标签: java selenium

我遗漏了一些非常基本的东西。我认为,无论我能收集什么,我都需要列出的id列表。一旦我有id,我想我可以获得列表并迭代它。

自动填充功能的Web代码是:

<div class="col-md-12">
     <label>Google Map Location*</label> 
     <input id="searchTextField" type="text" class="form-control" placeholder="Enter a location" autocomplete="on" required="required">
     <input id="latitude" type="text" style="display: none;" class="form-control" value=""> 
     <input id="longitude" type="text" style="display: none;"class="form-control" value="">
     <p class="help-block" style="color: #737373;">Instruction: Please drag the marker to get exact location of the IT park.</p>
</div>

用于初始化js代码的javascript是

        var input = document.getElementById('searchTextField');
        var autocomplete = new google.maps.places.Autocomplete(input);
        autocomplete.bindTo('bounds', map);

Selenium代码是:

autocompleteElement = God.getWebElementById("searchTextField");
autocompleteElement.sendKeys("Airport");
List<WebElement> autoCompleteList = Initialize.getInstance().getDriver().findElements(
                        By.className("form-control");
for (WebElement autocompleteItem : autoCompleteList) {
    if (autocompleteItem.getText().contains("Pune Airport")) {
        autocompleteItem.click();
    }
    break;
}

我得到的autocompleteItem为空或空。

修改1

我是javascript的新手,我继承了这个代码库。我无法理解的是如何为容器分配locatorid,以便我可以通过WebElement进行迭代,并根据我的需要执行click结果

修改2

我添加了自动完成检查元素的快照。下面的答案指的是xpath(“对我来说非常复杂”)。在我的特定情况下,如何替换xpath?

OR

您需要什么来帮助我获取下拉列表?

snapshot of the autocomplete dropdown

编辑3

我使用了类名form-control

List<WebElement> autoCompleteList = waitForElementByClass(
                        "form-control");
                System.out.println("autocomplete list size " + autoCompleteList.size());
                for (WebElement autocompleteItem : autoCompleteList) {
                    if (autocompleteItem.getText().contains("Wadgaon  Sheri")) {
                        System.out.println("auto complete selected " + autocompleteItem.getText());
                        autocompleteItem.click();
                        break;
                    } else
                        System.out.println("no match, tagname:" + autocompleteItem.getTagName() + "point:"
                                + autocompleteItem.getLocation());
                }

得到以下输出。请注意autocompleteItem.getText返回一个空字符串。

autocomplete list size 16
no match, tagname:inputpoint:(255, 200)
no match, tagname:selectpoint:(255, 274)
no match, tagname:inputpoint:(255, 433)
no match, tagname:selectpoint:(255, 509)
no match, tagname:inputpoint:(255, 553)
no match, tagname:inputpoint:(330, 553)
no match, tagname:inputpoint:(255, 627)
no match, tagname:textareapoint:(525, 200)
no match, tagname:textareapoint:(525, 324)
no match, tagname:inputpoint:(525, 450)
no match, tagname:inputpoint:(525, 526)
no match, tagname:inputpoint:(525, 602)
no match, tagname:inputpoint:(525, 678)
no match, tagname:inputpoint:(796, 200)
no match, tagname:inputpoint:(0, 0)
no match, tagname:inputpoint:(0, 0)

我现在正在尝试使用类名pac-container pac.logo,然后我会尝试使用div.pac-container.pac-logo :)。请记住,我的javascript技能不是太好。

pac-container pac.logo

编辑4 现在,我已经尝试了类名为pac-container pac.logopac-container.pac-logodiv.pac-container.pac.logopac-container

的结果
  

wait.until(ExpectedConditions.visibilityOfElementLocated(By.className(byclass)));

代码挂起了

如果我将该行替换为

  

wait.until(ExpectedConditions.elementToBeSelected(God.getWebElementByClassNae(byclass)));

我得到NoElementFoundException

因此,我最接近解决此问题的方法是找到该死的下拉列表的类名。

public List<WebElement> waitForElementByClass(String byclass) {
        WebDriverWait wait = new WebDriverWait(God.getCurrentBrowser(), 2000);
        List<WebElement> elements = null;
        boolean waitForElement = true;
        System.out.print("Waiting for " + byclass);
        do {
            System.out.print(".");
            try {
                //wait.until(ExpectedConditions.visibilityOfElementLocated(By.className(byclass)));                 wait.until(ExpectedConditions.elementToBeSelected(God.getWebElementByClassNae(byclass)));
                waitForElement = false;
                System.out.println("found");
                elements = God.getWebElementsByClassName(byclass);
            } catch (NoSuchElementException e) {
                waitForElement = true;
            } catch (TimeoutException e) {
                waitForElement = false;
                return null;
            }
        } while (waitForElement);
        return elements;
    }

4 个答案:

答案 0 :(得分:0)

使用WebDriverWait插入代码以等待元素可见。以下示例,

WebDriverWait wait = new WebDriverWait(driver,10000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("form-control")));

答案 1 :(得分:0)

我认为,在输入searchTextField后,您应该等待输入字段本身的列表。因此,在输入searchTextField之后,您将获得一个建议列表并获取该定位器。在您的代码中,等待该定位器,直到它可见。比如说,自动建议的定位器是autosuggestion-list(假设它是一个id),所以代码片段看起来像:

WebDriverWait wait = new WebDriverWait(driver,120); // wait 120 seconds until element is visible
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("autosuggestion-list")));

希望你能明白我的观点。

答案 2 :(得分:0)

试试这个。它会等到元素加载完毕并准备点击。

WebDriverWait wait = new WebDriverWait(driver,60);

wait.until(ExpectedConditions.elementToBeClickable(By.className("form-control")));

答案 3 :(得分:0)

我使用Google Instant search尝试了相同的方案,代码是

    driver.get("http://google.com");
    driver.findElement(By.id("lst-ib")).sendKeys("airport");
    Thread.sleep(2000); // mandatory to use in this case
    List<WebElement> autoSearchList=(List<WebElement>) driver.findElements(By.xpath("//*[@id='sbtc']/div[2]/div[2]/div[1]"));
    for ( WebElement item: autoSearchList)
    { 
        if(item.getText().contains("airport jobs"))
            item.click();
     }

我对此的看法:'autoSearchList'显示NULL值,即使我们使用隐式等待/显式等待以及特定条件。 只应使用Thread.sleep()来获取即时搜索的值。

我不知道为什么Selenium不会在这里工作,但你可以尝试使用sleep方法来达到输出。