Python-Selenium-WebDriver Страница прокручивает прошедшие элементы, не нажимая на них, даже если драйвер должен - PullRequest
1 голос
/ 27 марта 2019

Я работаю над проектом, использующим Python & Selenium WebDriver в Firefox, чтобы открыть Google, выполнить поиск определенного элемента, а затем Selenium открыть первые 5 результатов поиска на разных вкладках.

Я хочу сделать это путем репликации Ctrl Button Down-->Click Link-->Ctrl Button Up с использованием селена. Проблема, с которой я столкнулся при написании действия «Click», заключалась в том, что элементы были вне ViewPort, и на них нельзя было нажать. Поэтому я добавил действие Move_to_Element, и проблема не исчезла (НО ЭТО ОТКРЫЛО ПЕРВАЯ 2 ИЛИ 3 ССЫЛКИ Затем я добавил скрипт window.scroll_to, используя положение элемента в качестве ссылки, но теперь он не открывает никаких ссылок. Браузер открывается и просто прокручивает ссылку после ссылки, пока не достигнет последней.

Можете ли вы помочь мне выяснить, что я делаю здесь неправильно, так как логика кажется нормальной и она работала до добавления действия scroll_to (по крайней мере для первых 2-3 ссылок).

Большое спасибо

#TO-DO open google
browser = webdriver.Firefox()
browser.get("https://www.google.com")

#Selecting the search bar and send search text
searchElem = browser.find_element_by_css_selector('.gLFyf')
searchElem.send_keys("cars")
searchElem.submit()
time.sleep(5)
last_height = browser.execute_script("return document.body.scrollHeight")
# browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

found_elems=browser.find_elements_by_class_name('LC20lb')

#Selecting and clicking on first 5 pages
idx = 0

while idx <= min(len(found_elems),5):
    found_elem = found_elems[idx]

    #Find the height of the element
    ht = found_elem.location['y']

    print("Opening up ",found_elem.text)#Page Name
    try:
        print("In try block")

        #Scrolling to the element
        browser.execute_script("window.scrollTo(0, {});".format(ht))

        #Setting up Action Chains to move to elem-> Click on the links #with ctrl key down so as to open them in different tabs 
        ActionChains(browser)\
        .move_to_element(found_elem)\
        .key_down(Keys.CONTROL) \
        .click(found_elem) \
        .key_up(Keys.CONTROL) \
        .perform()
        print("Browser moved to "+str(ht))
        print("Exiting try")

    except Exception as e:
        print("In exception")
        print(e)
        break
    idx + = 1

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Если вы планируете открывать поисковые ссылки в новых вкладках. Тогда вот упрощенный код.

browser.get("https://www.google.com")

#Selecting the search bar and send search text
searchElem = browser.find_element_by_css_selector('.gLFyf')
searchElem.send_keys("cars")
searchElem.submit()
time.sleep(5)

found_elems=browser.find_elements_by_xpath("//*[@class='LC20lb']/parent::a")

#Selecting and clicking on first 5 pages
idx = 0

while idx <= min(len(found_elems),5):
    found_elem = found_elems[idx]
    # scroll to link
    found_elem.location_once_scrolled_into_view

    print("Opening up ",found_elem.text)#Page Name
    try:
        # opening the link in new tab
        browser.execute_script("window.open('"+found_elem.get_attribute('href')+"')")
    except Exception as e:
        print(e)
        break
    idx =idx+1
0 голосов
/ 27 марта 2019

Последняя строка в вашем цикле,

idx + = 1

Имеет неверный синтаксис.Это должно быть idx += 1 вместо этого.Так что я не понимаю, как бы вы вышли из цикла, он просто продолжал бы повторяться с idx = 0, я что-то упустил?

...