简体   繁体   中英

Python Selenium rel=nofollow link

The Python Selenium code

driver.find_element_by_link_text("Off").click()

is correct and executes without errors. The fault is that the click follows the "nofollow" to the 404 error. This code should only change the view state of the webpage. This behaviour is true for both Firefox and Chrome webdriver. The only other changes to my development environment were the Linux kernel updates.

I would appreciate any suggestions.

A FULL SAMPLE BELOW:

# -*- 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
import unittest, time, re

class UntitledTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.katalon.com/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_untitled_test_case(self):
        driver = self.driver
        driver.get("https://www.modelmayhem.com/portfolio/768765/viewall")
        driver.find_element_by_link_text("Off").click()

    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)

    def links_processor(self, links):

        # A hook into the links processing from an existing page, done in order to not follow "nofollow" links
        ret_links = list()
        if links:
            for link in links:
                if not link.nofollow: ret_links.append(link)
        return ret_links

if __name__ == "__main__":
    unittest.main()

Problem is cookies popup. With implicitly_wait just add click to "I AGREE" button:

driver.find_element_by_link_text("I AGREE").click()
driver.find_element_by_link_text("Off").click()

If you'll use WebDriverWait , to wait until "I AGREE" will be clickable and close it:

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

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "I AGREE"))).click()
driver.find_element_by_link_text("Off").click()

Screenshot of cookies popup:
在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM