我正试图在一个用于搜索最便宜航班的网站上使用Selenium进行漫游。我已经能够在整个搜索过程中进行磨合,但现在我被航班选择卡住了。我设法按公司名称订了机票。现在我需要点击两个第一个航班(出发,抵达)。
正如您在所附图片中看到的,网页生成了两个表。他们每个人都列出了一些航班。我需要点击每张表的第一张。
问题是生成的列表为不同的公司使用不同的DIV ID,并且ID具有随机数("_X",X是随机数)。
我只需要点击每个表上的DIV,任何一个comcolumn都可以。但所有列都使用相同的名称(在两个表上)。
使用selenium IDE现在可以工作,但只需要几个小时,因为航班、价格和小时都会不断更新,网页每次显示不同的结果,这意味着每次都有不同的ID。
有办法解决这个问题吗?
重要提示:我使用的是带有Selenium的JAVA。没有PERL,没有PYTHON或其他。
这将是现在使用JAVA的步骤:
// This orders the departure flight by company.
selenium.click("id=orden-compania-ida");
selenium.click("id=orden-compania-ida");
// This orders the arrival flights by company.
selenium.click("id=orden-compania-vuelta");
selenium.click("id=orden-compania-vuelta");
// This would click on the first link of first table
selenium.click("css=div.col-3 > label");
selenium.click("id=I_5");
// This would click on the first link of the second table
selenium.click("css=#TV_GDSAMADEUS_7 > div.col-3 > label");
selenium.click("id=V_12");
目前这是有效的,但在航班更新后,这将不再有效。有没有什么方法可以让硒一直点击每张桌子的第一个右边?
提前非常感谢。
链接到图像
在我看来,您应该尝试通过CSS选择器选择必要的div,而不是使用ID选择器。请仔细阅读下面的代码,弄清楚我的确切意思。
// Open Firefox driver.
WebDriver driver = new FirefoxDriver();
// Send a get request.
driver.get("http://google.com");
// Typing a search query.
WebElement searchField = driver.findElement(By.name("q"));
searchField.sendKeys("Cheese!");
// Waiting for the driver to change its title and load search results.
new WebDriverWait(driver, 20).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().contains("cheese");
}
});
// Obtain dymamically loaded search results.
List<WebElement> results = driver.findElements(By.cssSelector("h3.r"));
// Go through the search results
for (WebElement element : results) {
// You can click instead of printing.
System.out.println(element.getText());
}
// Close the driver.
driver.close();
这是一个来自硒官方网站的编辑过的例子。