Не удается прокрутить с помощью selenium WebDriver и Javascript-исполнителя

#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=самые новые списки и поисковый источник=главная

  1. С помощью браузера Chrome.
  2. Попытался использовать все возможные методы прокрутки , вы можете проверить прокомментированный код.
  3. для всех команд прокрутки , которые просто прокручиваются до одной и той же точки на веб-сайте, я не уверен, что что-то упускаю. Полоса прокрутки доходит до этого момента для всех команд прокрутки

Журналы ошибок:

 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:

Пара вещей, о которых нужно позаботиться :

  1. Там есть кнопка cookie, я выбираю Accept all cookies (если вы не будете взаимодействовать с кнопкой Cookie), вы не сможете scroll down этого сделать .
  2. Используйте 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();
    }