Używam selenu i próbuję zmienić sterownik na nową stronę, którą otwiera (ta sama karta). Driver.switch_to nie działa, ponieważ myślę, że jest używany, gdy otwiera się nowe okno sterownik. Current_url również nie działa, ponieważ daje mi adres URL poprzedniej strony i nie mogę dowiedzieć się, jak uzyskać adres URL bieżącej strony

Heres kodu:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver.get("https://www.youtube.com")

searchBar = driver.find_element_by_name("search_query")
searchBar.send_keys("unbox therapy")
searchBar.send_keys(Keys.ENTER)

print(driver.current_url)

To nadal zwraca https://www.youtube.com potrzebuję zapytania, które powinno wyglądać mniej więcej tak https://www.youtube.com/results?search_query=unbox+therapy

2
Aditya 20 grudzień 2019, 07:52

3 odpowiedzi

Należy wcześniej dodać trochę czasu oczekiwania driver.current_url Ponieważ pełne załadowanie witryny zajmuje trochę czasu. Czas ładowania zależy również od szybkości połączenia internetowego i innych czynników. U mnie zadziałało bez czasu oczekiwania.

import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver

driver = webdriver.Chrome("/home/teknath/Desktop/chromedriver")
driver.get("https://www.youtube.com")

searchBar = driver.find_element_by_name("search_query")
searchBar.send_keys("unbox therapy")
searchBar.send_keys(Keys.ENTER)
time.sleep(5)
print(driver.current_url)
1
Tek Nath 20 grudzień 2019, 08:02

Jak powiedział Tek Nath, możesz dodać czas oczekiwania, ale możesz też zrobić coś takiego.

searchTerm = "unbox therapy"
replaceSpaceWithPlus(searchTerm)
driver.get("https://www.youtube.com/results?search_query=" + searchTerm)
0
Noah 20 grudzień 2019, 08:00

Odpowiedź @TekNath była we właściwym kierunku i była prawie idealna. Sugeruję jednak unikanie time.sleep(5) w kodzie, ponieważ:

time.sleep(secs) zawiesza wykonywanie bieżącego wątku na podaną liczbę sekund. Argumentem może być liczba zmiennoprzecinkowa wskazująca dokładniejszy czas snu. Rzeczywisty czas zawieszenia może być krótszy niż żądany, ponieważ każdy przechwycony sygnał zakończy sleep() po wykonaniu procedury przechwycenia tego sygnału. Ponadto czas zawieszenia może być dłuższy niż żądana o dowolną kwotę ze względu na zaplanowanie innej aktywności w systemie.

Szczegółowa dyskusja w Jak spać WebDriver Python dla milisekund

Alternatywnie możesz wywołać WebDriverWait dla title_contains() i skorzystać z następujących Strategia lokalizatora:

  • Blok kodu:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.keys import Keys
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.youtube.com/")
    searchBar = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#search")))
    searchBar.send_keys("unbox therapy")
    searchBar.send_keys(Keys.ENTER)
    WebDriverWait(driver, 10).until(EC.title_contains("unbox therapy"))
    print(driver.current_url)
    
  • Wyjście konsoli:

    https://www.youtube.com/results?search_query=unbox+therapy
    
0
DebanjanB 20 grudzień 2019, 11:39