#javascript #java #selenium #webdriver
Вопрос:
Я пытаюсь найти 5-й элемент в списке и нажать на него.
Список всех сохраненных комнат :
@FindBy(xpath="//p[@class='css-6v9gpl-Text eczcs4p0']")
List<WebElement> placeListings;
Код:
public void clickon5thHouse()
{
Web4 = placeListings.get(4); // **This is a list of all the webelements in <div> tag | I am picking 4th element from the list and trying to click on it**
int x = Web4.getLocation().getX();
int y = Web4.getLocation().getY();
//scroll to x y
JavascriptExecutor js = (JavascriptExecutor) driver;
WebDriverWait wait;
wait = new WebDriverWait(driver,40);
//((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", Web4);
//((JavascriptExecutor) driver).executeScript("window.scrollTo(0,document.documentElement.scrollHeight);");
js.executeScript("window.scrollBy(" x ", " y ")");
wait.until(ExpectedConditions.elementToBeClickable(Web4));
Web4.click();
//((JavascriptExecutor) driver).executeScript("arguments[0].click();", Web4);
}
Url-адрес для веб-сайта
https://www.zoopla.co.uk/for-sale/property/london/?q=Лондон и results_sort=самые новые списки и поисковый источник=главная
- С помощью браузера Chrome.
- Попытался использовать все возможные методы прокрутки , вы можете проверить прокомментированный код.
- для всех команд прокрутки , которые просто прокручиваются до одной и той же точки на веб-сайте, я не уверен, что что-то упускаю. Полоса прокрутки доходит до этого момента для всех команд прокрутки
Журналы ошибок:
org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <p size="6" class="css-6v9gpl-Text eczcs4p0">...</p> is not clickable at point (845, 13).
Other element would receive the click: <a data-testid="listing-details-link" href="/for-sale/details/58485081/" class="e2uk8e4 css-15tydk8-StyledLink-Link-FullCardLink e33dvwd0">...</a>
Ответ №1:
Пара вещей, о которых нужно позаботиться :
- Там есть кнопка cookie, я выбираю
Accept all cookies
(если вы не будете взаимодействовать с кнопкой Cookie), вы не сможетеscroll down
этого сделать . - Используйте
JavascriptExecutor
иActions class
Пример кода :
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.zoopla.co.uk/for-sale/property/london/?q=Londonamp;results_sort=newest_listingsamp;search_source=home");
WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[class$='ui-cookie-accept-all-medium-large']"))).click();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0, 250)");
Actions a = new Actions(driver);
List<WebElement> allImgs = driver.findElements(By.cssSelector("a[data-testid='listing-details-image-link'] img"));
ArrayList<WebElement> allPrices = (ArrayList<WebElement>) driver.findElements(By.cssSelector("div[class*='CardHeader'] p"));
System.out.println(allImgs.size() "and " allPrices.size());
int i = 0;
for(WebElement e : allImgs) {
a.moveToElement(e).build().perform();
System.out.println(allPrices.get(i).getText());
i ;
}
Выход :
25and 32
£2,140,000
Offers in region of
£525,000
£650,000
£480,000
£270,000
Guide price
£750,000
£1,260,000
£475,000
£695,000
£450,000
£795,000
£335,000
£849,950
Offers over
£650,000
Offers over
£725,000
Guide price
£430,000
Guide price
£300,000
£520,000
£1,500,000
PASSED: testSO
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================
Обновление 2 :
for(WebElement e : allImgs) {
a.moveToElement(e).build().perform();
System.out.println(allPrices.get(i).getText());
if(i == 5) {
e.click();
break;
}
i ;
}
Комментарии:
1. Привет @cruisepandey , я пытался использовать все вышеперечисленные коды, но все равно получал ошибку ниже
org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <p size="6" class="css-6v9gpl-Text eczcs4p0">...</p> is not clickable at point (526, 551). Other element would receive the click: <a data-testid="listing-details-link" href="/for-sale/details/58064451/" class="e2uk8e4 css-15tydk8-StyledLink-Link-FullCardLink e33dvwd0">...</a> (Session info: chrome=91.0.4472.101)
2. В чем заключается ошибка ? и какой из них вы использовали ?
3. Вы запускаете драйвер в полноэкранном режиме ? он безголовый ?
4. для всех команд прокрутки это просто прокрутка до одной и той же точки на веб-сайте
5. Может быть, я смогу взглянуть … но дай мне как-нибудь
Ответ №2:
Просто сверьтесь с приведенной ниже строкой кода, я надеюсь, что приведенный ниже код поможет
driver.get(" https://www.zoopla.co.uk/for-sale/property/london/?
q=Londonamp;results_sort=newest_listingsamp;search_source=home");
WebElement element = driver.findElement(By.xpath("(((//*[@data-testid='search-result'])[5])/div/div[2]/div[2]//following-sibling::a)"));
((JavascriptExecutor)driver).executeScript
("arguments[0].scrollIntoView(true);", element);
element.click();
edit it as per your requirement
Комментарии:
1. Привет, Маниш , Спасибо , что нашли время ответить , я также обновил свой вопрос, мне нужно нажать на пятый элемент из списка. WebElement динамичен , новичок в stackoverflow , пожалуйста, не обращайте внимания на глупые ошибки
2. @Jyoti вы можете проверить XPath в ответе, это может вам помочь
Ответ №3:
Наконец-то я получил ответ
import com.zoopla.qa.base.Base;
public class propertyListing extends Base {
static int Web4;
@FindBy(xpath="//p[@class='css-6v9gpl-Text eczcs4p0']")
List<WebElement> placeListings;
List<Integer> sortedPlaceListings = new ArrayList<>();
public propertyListing() throws IOException {
PageFactory.initElements(driver, this);
}
public int getpropertyListing()
{
for(WebElement e: placeListings)
{
String textList = e.getText().substring(1);
String changedText = textList.replaceAll(",", "");
if(changedText != "POA")
{
sortedPlaceListings.add(Integer.parseInt(changedText));
}
}
Collections.sort(sortedPlaceListings , Collections.reverseOrder());
for(Integer s: sortedPlaceListings)
System.out.println(s);
return sortedPlaceListings.size();
}
public void clickon5thHouse()
{
Web4 = sortedPlaceListings.get(4);
NumberFormat formatter=NumberFormat.getCurrencyInstance(Locale.UK);
formatter.setMaximumFractionDigits(0);
String currency=formatter.format(Web4);
WebElement element = driver.findElement(By.xpath("//p[contains(text(),'" currency "')]//parent::div/parent::div/following-sibling::a"));
WebDriverWait wait;
wait = new WebDriverWait(driver,40);
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
wait.until(ExpectedConditions.elementToBeClickable(element));
element.click();
}
}
мой Тестовый класс
@Test
public void verifyHomeListings()
{
int countOfRooms = property.getpropertyListing();
Assert.assertEquals(25, countOfRooms);
property.clickon5thHouse();
}