Элемент не может быть найден, если поиск элемента выполняется до появления элемента на странице.
В данном коде при выполнении driver.find_element_by_id("openwindow").click()
открывается новая страница. и sel=driver.find_element_by_partial_link_text("Login")
завершается ошибкой, так как элемент не отображается (проблемы с сетью, медленный ноутбук и т. д. c.).
Стандартное решение, в данном случае, состоит в использовании класса WebDriverWait
для дождитесь состояния элемента и, только если появится желаемое состояние (например, наличие элемента на странице), продолжить выполнение.
Вот пример
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Firefox()
driver.get("https://learn.letskodeit.com/p/practice")
driver.implicitly_wait(2)
ParentWin = driver.current_window_handle
print(ParentWin)
driver.find_element_by_id("openwindow").click()
windows = driver.window_handles
print(windows)
for Tab in windows:
print(Tab)
if Tab != ParentWin:
print("Switched to sub window")
driver.switch_to.window(Tab)
print(Tab)
# wait until "Login" appers on the page
sel = WebDriverWait(driver, 5).until(
expected_conditions.visibility_of_element_located(
(By.PARTIAL_LINK_TEXT, "Login")
)
)
# work with login button
sel.click()
driver.close()
break
driver.switch_to.window(ParentWin)
driver.execute_script("window.scrollBy(0, 1000);")
driver.quit()