0

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()
Kieirn
  • 1
  • 2

1 Answers1

-1

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:
enter image description here

Sers
  • 12,047
  • 2
  • 12
  • 31