Я выполняю поиск элемента, в то время как его прокрутка будет ждать, пока элемент не появится.
Я преуспел в этом конкретном поиске, в котором он остановит прокрутку и поиск, как только будет найден элемент.
Только когда он, наконец, достиг нижней части страницы, он продолжает ждать, прокручивать и искать и никогда не останавливаться.
Как я могу разорвать этот непрерывный цикл?(моя ситуация очень похожа на этот вопрос Selenium ждет, когда будет присутствовать любое из 2 условий )
- скажем, я хочу добавить два условия: 1) если элемент не найден,продолжайте прокручивать до тех пор, пока не найдете, 2) в то же самое время прокрутки сохраняйте оповещение, как только нижний элемент страницы найден, немедленно пропустите эту функцию и перейдите к следующей функции.
Мой код выглядит следующим образом:
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import unittest, time, re, time
options = webdriver.ChromeOptions()
prefs = {"profile.default_content_setting_values.notifications" : 2, "profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)
options.add_argument("start-maximized")
options.add_argument("incognito")
##options.add_argument("--headless")
capabilities = options.to_capabilities()
email = "somename@somemail.com"
password = "somepass"
userID1 = "someID" # certain name
userID2 = "someID2" # certain name
class somesearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(options=options)
self.driver.implicitly_wait(3)
self.base_url = "https://www.facebook.com/"
self.verificationErrors = []
self.accept_next_alert = True
def test_some_search(self):
driver = self.driver
driver.get("https://www.facebook.com/")
driver.find_element_by_id("email").click()
driver.find_element_by_id("email").clear()
driver.find_element_by_id("email").send_keys(email)
driver.find_element_by_id("pass").clear()
driver.find_element_by_id("pass").send_keys(password)
driver.find_element_by_xpath("//label[@id='loginbutton']/input").click()
driver.get(self.base_url + userID1)
def search_element():
wait = WebDriverWait(driver, 10)
find_elem = None
scroll_from = 0
scroll_limit = 3000
try:
self.assertTrue(self.is_element_present(By.XPATH, "(//span[(@aria-level='3') and contains(@class, '_2iel _5kx5')])"))
while not find_elem:
driver.execute_script("window.scrollTo(%d, %d);" %(scroll_from, scroll_from+scroll_limit))
scroll_from += scroll_limit
while not EC.presence_of_element_located((By.XPATH, "(//div[(@class='_3-8x _2iek')])")):
try:
wait.until(EC.presence_of_element_located((By.XPATH, "(//a[(@aria-pressed='false') and contains(@class, '_18vj')])[1]")))
element = driver.find_element_by_xpath("(//a[(@aria-pressed='false') and contains(@class, '_18vj')])[1]")
driver.execute_script("arguments[0].click();", element)
except:
pass
except AssertionError as e:
pass
search_element()
driver.get(self.base_url + userID2)
def search_element():
wait = WebDriverWait(driver, 10)
find_elem = None
scroll_from = 0
scroll_limit = 3000
try:
self.assertTrue(self.is_element_present(By.XPATH, "(//span[(@aria-level='3') and contains(@class, '_2iel _5kx5')])"))
while not find_elem:
driver.execute_script("window.scrollTo(%d, %d);" %(scroll_from, scroll_from+scroll_limit))
scroll_from += scroll_limit
while not EC.presence_of_element_located((By.XPATH, "(//div[(@class='_3-8x _2iek')])")):
try:
wait.until(EC.presence_of_element_located((By.XPATH, "(//a[(@aria-pressed='false') and contains(@class, '_18vj')])[1]")))
element = driver.find_element_by_xpath("(//a[(@aria-pressed='false') and contains(@class, '_18vj')])[1]")
driver.execute_script("arguments[0].click();", element)
except:
pass
except AssertionError as e:
pass
search_element()
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
Требуемый результат: : как только найден нижний элемент, пропустите текущую функцию и перейдите ко второй функции.
Нежелательный результат : Функция продолжает работать, прокрутка и поиск элемента, даже когда он фактически достиг нижней части страницы.
Пожалуйста, помогите мне решить эту проблему, я действительно нуб и не имею опыта работы с Python.