3

unable to scroll the tab profile

Hi, I am able to switch between tabs, access all elements. I am unable to scroll in this iframe. Please help. Code I am using is as follows.

    iframe = self.browser.find_elements_by_tag_name('iframe')[0]
    self.browser.switch_to_frame(iframe)

    # Iterating through tabs
    for tab_name in soup.find_all('md-dummy-tab'):
        return_dict[tab_name.text] = []
        tab_names.append(tab_name.text)
        # clicking on tabs one by one
        self.force_click('xpath=/html/body/div/md-content/md-tabs/md-tabs-wrapper/md-tabs-canvas/md-pagination-wrapper/md-tab-item[%s]/span' % tab)
        tab += 1
        time.sleep(2)

        # Scrolling
        try:
            self.browser.execute_async_script("frame.scrollTo(0, 10000);")
        except:
            pass
        time.sleep(2)

3 Answers3

1

You can use this code to scroll-down in frame.

frame.contentWindow.scrollTo(0, 300);

For more info you can see this link :- scroll an iframe from parent page

Ankur Singh
  • 1,239
  • 1
  • 8
  • 18
  • In python, do we have an equivalent method? – unnikrishnan.v Jun 21 '17 at 08:46
  • you can use javaScript in python ton run this javaScript code driver.execute_script("document.you'rlocator('comment-user').contentWindow.scrollTo(0, 300)") – Ankur Singh Jun 21 '17 at 08:55
  • self.browser.execute_script('%s.contentWindow.scrollTo(0, 300);' % iframe) "iframe" is the local variable. Error. selenium.common.exceptions.WebDriverException: Message: expected expression, got '<'. – unnikrishnan.v Jun 21 '17 at 12:28
  • do you need to scroll to a specific location within iframe? what about moving and bringing focus to an element inside iframe actions = ActionChains(driver) actions.move_to_element(menu) – Satish Jun 21 '17 at 20:01
  • I am actually trying to retrieve table data in the frame. Table is having 27 rows, but while getting page source and parsing it, I am getting only first 20 rows of data. So i need to scroll to end of the table and get page source. – unnikrishnan.v Jun 22 '17 at 04:31
1

I found the following commands to help. First, assuming one has already switched to an iframe where the element is accessible, store the location of that element. Then switch back to the default content and scroll in the window. Then, search again for the iframe, switch to that iframe, and reload any other dynamical variables in Selenium needed to continue.

length = prods[p].location["y"]
self.driver.switch_to.default_content()
self.driver.execute_script("window.scrollTo(0,"+str(length) + ");")
iframe = self.driver.find_elements_by_xpath('.//iframe[contains(@id,"frame")]')
self.driver.switch_to_frame(iframe[0])
prods = self.driver.find_elements_by_xpath('.//div[@class="products"]')
prods[p].click()
1

Try location_once_scrolled_into_view:

# assume `driver` is an instance of `WebDriver`
element = driver.find_element(By.CSS_SELECTOR, 'some_element')
# `location_once_scrolled_into_view` is a property that behaves like function
element.location_once_scrolled_into_view

A Python function wrapper:

# it's not necessary to switch into the iframe where your element is located before calling this function.
def scroll_into_view(driver, element=None, css_selector=None):
    if (not element) and (not css_selector):
        return
    if css_selector and (not element):
        element = driver.find_element_by_css_selector(css_selector)
    driver.execute_script('arguments[0].scrollIntoView({block: "center"})', element)

more about javascript function scrollIntoView

cangyin
  • 43
  • 7