Как пропустить WebDriverWait, если он не True? - PullRequest
0 голосов
/ 05 мая 2020

Немного плохо на английском sh. Я просто делаю простого инстаграм-бота, который сначала берет имена пользователей и пароли из текстового файла и помещает их для входа на веб-сайт, но «Включить уведомление» появляется только при первом входе в систему. Когда бот входит в систему со второй учетной записью, он не появляется. Я хочу, чтобы мой WebdriverWait игнорировал, если не находил никаких элементов. Я хочу, чтобы он игнорировал, если «Включить уведомление» не появляется в других учетных записях.

Мой код для удаления Всплывающее окно включения уведомления:

pop_up = ui.WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".aOOlW.HoLwm"))).click() # Remove notification
sleep(4)

Весь мой код:

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

from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


# Create a list of username, password pairs from your file.
username_password_list = list()
with open("C:\\Users\\user\\AppData\\Roaming\\JetBrains\\PyCharmCE2020.1\\scratches\\detail.txt") as file:
 for line in file:
   user, password = line.split(':')
   username_password_list.append((user, password))

browser = webdriver.Firefox() # Runs Firefox.
browser.implicitly_wait(5)

browser.get('https://www.instagram.com/') # Web address to load.

for user, password in username_password_list:
class Main:
    username_input = browser.find_element_by_css_selector('input[name="username"]') # Finds username field.
    password_input = browser.find_element_by_css_selector('input[name="password"]') # Finds password field.

    username_input.send_keys(user) # Input username.
    password_input.send_keys(password) # Input password.

    login_button = browser.find_element_by_xpath('//button[@type="submit"]') # Finds login button.
    login_button.click() # Click login button.

    pop_up = ui.WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".aOOlW.HoLwm"))).click() # Remove notification.
    sleep(4)

class SearchBar:
    Search = browser.find_element_by_xpath('//input[contains(@class, "XTCLo x3qfX")]') # Find search bar.
    Search.send_keys("Any_Username") # Input.
    browser.find_element_by_class_name("yCE8d").click() # Search.
    sleep(5)

    browser.find_element_by_xpath('//span[@class="vBF20 _1OSdk"]').click() # Finds follow button and click.
    sleep(5)

class Logout:
    browser.find_element_by_xpath('//*[@id="react-root"]/section/nav/div[2]/div/div/div[3]/div/div[5]').click() # Go to profile.
    sleep(5)

    browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/header/section/div[1]/div/button').click() # Click settings.
    sleep(5)

    browser.find_element_by_xpath('/html/body/div[4]/div/div/div/button[9]').click() # Click logout.
    sleep(5)

browser.close()

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете сделать это с помощью блока try/except:

try:

    ui.WebDriverWait(browser, 10).until(EC.visibility_of_element_located(
        (By.CSS_SELECTOR, ".piCib")))
    ui.WebDriverWait(browser, 5).until(EC.element_to_be_clickable(
        (By.CSS_SELECTOR, ".aOOlW.HoLwm"))).click()
except:

    pass

except блок будет выполняться после 5-секундного c тайм-аута, когда нет всплывающего окна.

Надеюсь, это тебе поможет!

...