0

Так что мне нужно отказаться от страницы, например this for example или this, и я использую Scrapy + Seleninum для взаимодействия с календарем датпикера.Screenscraping a Datepicker with Scrapy + Selenium

В основном мне нужно проверить наличие номеров на каждый день в месяц, например, поэтому моя идея пыталась щелкнуть не отключенные ссылки/даты на datepicker и проверить, появляется ли сообщение об ошибке или нет. мне знать, доступно ли это или нет.

Я понятия не имею, правильно ли это или как это сделать с помощью этих инструментов. Я играл с ними, но по-прежнему выглядит так, как будто я далек от окончательного решения.

Кто-нибудь знает, как я могу справиться с этим или даже предоставить код для меня, чтобы достичь этого?

+0

Да, что вы ищете, можно сделать, и я могу это сделать в selenium + java, но я не уверен, что вы подразумеваете под Scrapy + Seleninum. –

+0

Можете ли вы разместить код на Java? – psychok7

+0

Да, конечно, дайте мне 15-30 минут –

ответ

1

Привет пожалуйста, найти ответ ниже

WebDriver driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
driver.manage().window().maximize(); 
driver.get("https://www.airbnb.pt/rooms/516301?check_in=2016-04-14&guests=1&check_out=2016-04-17"); 

// selecting firstdate picker -- check in 

driver.findElement(By.xpath("//*[@class='col-sm-6']/input")).click(); 
// note calendar is not completely visible hence to make it visible 
// scroll a little bit down 
((JavascriptExecutor) driver).executeScript("window.scrollBy(0,200)"); 
// take all calendar dates inside the list 
// here i have update my code to skip stale element exception 
List<WebElement> alldates = driver.findElements(By.xpath("//*[@class='ui-datepicker-calendar']/tbody/tr/td/a[contains(@class, 'ui-state-default')]")); 
System.out.println("Size is : "+ alldates.size()); 
// suppose you want to select 27 form the all dates 
// keeping it as a parameter 
String dateToBeSelected = "19"; // check in 
for(int i=0;i<alldates.size();i++){ 
    alldates = driver.findElements(By.xpath("//*[@class='ui-state-default']")); 
System.out.println("dates is : " + alldates.get(i).getText()); 
// selects a check-in date 
if(alldates.get(i).getText().equals(dateToBeSelected)){ 
    alldates.get(i).click(); 
    break; 
      } 
     } 
// on selection of Checkin date check out calender automatically pop ups 
System.out.println("--------------------------"); 
String datetobeselected = "27"; 
for(int i=0;i<alldates.size();i++){ 
    alldates = driver.findElements(By.xpath("//*[@class='ui-state-default']")); 
System.out.println("dates is : " + alldates.get(i).getText()); 
// selects a check-in date 
if(alldates.get(i).getText().equals(datetobeselected)){ 
    alldates.get(i).click(); 
    break; 
      } 
     } 
// actually after calendar selection whatever text is shown in red color 
// i am not sure what is it (sorry only English) 

// identify the text with red color is present or not 
boolean errorMsg = driver.findElement(By.xpath("//*[@class='panel-body panel-light']/div[2]/p")).isDisplayed(); 
if(errorMsg){ 
    System.out.println("error msg is displayed"); 
}else{ 
System.out.println("error msg is not - displayed"); 
     } 

Надеется, что это помогает также отметить этот пример выше занимает регистрацию заезда и дату проверки в качестве параметра, если вы хотите код принять ноны инвалида дату автоматически, пожалуйста, не стесняйтесь спрашивать я уточню свой ответ.

+0

спасибо, я испытаю это как можно скорее и сообщит вам (отметьте, что вы отвечаете как правильно), если он работает – psychok7

+0

Я думаю, что я почти там, но я столкнулся с этой проблемой иногда прямо перед проверкой того, является ли элемент тем, который я хочу нажать «StaleElementReferenceException: Сообщение: элемент не найден в кеше - возможно, страница изменилась с тех пор, как она была просмотрена», и я также запутался в «NoSuchElementException: Message: Unable найти элемент 'при поиске сообщения, чтобы проверить, доступно ли его или нет. Кстати, вы не добавили щелчок, чтобы изменить месяцы? – psychok7

+0

только для того, чтобы добавить, как бороться с исключением устаревшего элемента: вы можете увидеть выше код в циклах выбора даты регистрации и выписки даты (dateToBeSelected = "19"; datetobeselected = "27";) Я снова позвонил в alldates просто чтобы избежать устаревшего элемента, поэтому вы можете сделать это так же и в своем коде. –