diff --git a/mwclient/page.py b/mwclient/page.py
index 1475b7cc6ed2cf989051215ac712ff9bce4f6772..89178607af088b697c0b825bb4e927e3786496f4 100644
--- a/mwclient/page.py
+++ b/mwclient/page.py
@@ -53,7 +53,7 @@ class Page(object):
         self.exists = 'missing' not in info
         self.length = info.get('length')
         self.protection = {
-            i['type']: (i['level'], i['expiry'])
+            i['type']: (i['level'], i.get('expiry'))
             for i in info.get('protection', ())
             if i
         }
diff --git a/test/test_page.py b/test/test_page.py
index 85f817452cf8201e502e24e179be8d986367fb9c..d24910e18a7e7d7213307ee02943be6a4973dfab 100644
--- a/test/test_page.py
+++ b/test/test_page.py
@@ -165,6 +165,12 @@ class TestPage(unittest.TestCase):
         assert page.can('edit') is True  # User has 'autoconfirmed'  right
         assert page.can('move') is True  # User has 'sysop' right
 
+        # check an unusual case: no 'expiry' key, see
+        # https://github.com/mwclient/mwclient/issues/290
+        del mock_site.get.return_value['query']['pages']['728']['protection'][0]['expiry']
+        page = Page(mock_site, title)
+        assert page.protection == {'edit': ('autoconfirmed', None), 'move': ('sysop', 'infinity')}
+
     @mock.patch('mwclient.client.Site')
     def test_redirect(self, mock_site):
         # Check that page.redirect is set correctly