我遗漏了一些非常基本的东西。我认为,无论我能收集什么,我都需要列出的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
的新手,我继承了这个代码库。我无法理解的是如何为容器分配locator
或id
,以便我可以通过WebElement
进行迭代,并根据我的需要执行click
结果
修改2
我添加了自动完成检查元素的快照。下面的答案指的是xpath(“对我来说非常复杂”)。在我的特定情况下,如何替换xpath?
OR
您需要什么来帮助我获取下拉列表?
编辑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技能不是太好。
编辑4
现在,我已经尝试了类名为pac-container pac.logo
,pac-container.pac-logo
,div.pac-container.pac.logo
和pac-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;
}
答案 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方法来达到输出。