пока элемент не найден, продолжайте прокрутку, пока не найдете, но если другой элемент найден, пропустите текущую функцию и перейдите к следующей функции - PullRequest
0 голосов
/ 16 февраля 2019

Я выполняю поиск элемента, в то время как его прокрутка будет ждать, пока элемент не появится.

Я преуспел в этом конкретном поиске, в котором он остановит прокрутку и поиск, как только будет найден элемент.

Только когда он, наконец, достиг нижней части страницы, он продолжает ждать, прокручивать и искать и никогда не останавливаться.

Как я могу разорвать этот непрерывный цикл?(моя ситуация очень похожа на этот вопрос 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...