Селен выдает ошибку, когда окно в другом соотношении сторон

#python #asp.net #selenium #web-scraping

Вопрос:

Поэтому я пытаюсь наскрести https://www.iob.in/Branch.aspx и хочу перейти на разные страницы и использовал для этого селен. Он хорошо работает на более широком экране, но на более высоких экранах кнопка банкомат/отделение находится над страницами 6/7, и селен не может понять их или прокрутить, чтобы дотянуться. Как-нибудь обойти это или как это исправить? Я попытался запустить в максимальном режиме или установить фиксированный размер окна, но это не решает проблему

     options.add_argument("window-size=1900,900")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)
    driver = webdriver.Chrome(
        options=options,
    )
    driver.get("https://www.iob.in/Branch.aspx")
    blah = []
    for page in range(2, 10):
        try:

            WebDriverWait(driver, 20).until(
                EC.visibility_of_element_located(
                    (
                        By.XPATH,
                        f"//*[@id='ctl00_ContentPlaceHolder1_gv_Branch']/tbody/tr[22]/td/table/tbody/tr/td[{page}]/a",
                    )
                )
            ).click()
 

Ответ №1:

Селен не нажимает на элемент, если он не находится в видимой области страницы. Вы можете использовать javascript, чтобы щелкнуть элемент, даже если он не находится в видимой области, например:

 driver.implicitly_wait(20)  # just an alternate to WebDriverWait, but it's value is set for whole life of the program until you change it

....
for page in range(2, 10):
    element = driver.find_element_by_xpath(f"//*[@id='ctl00_ContentPlaceHolder1_gv_Branch']/tbody/tr[22]/td/table/tbody/tr/td[{page}]/a")
    driver.execute_script("arguments[0].click()", element)  # worked with small screen.
 

Ответ №2:

если вы просто хотите, чтобы селен отрегулировал высоту страницы, вы можете использовать это:

 height = driver.execute_script("return document.body.scrollHeight")
driver.set_window_size(1056, height)