【问题标题】:How to click on a link in a table using selenium如何使用硒单击表中的链接
【发布时间】:2021-06-02 13:45:20
【问题描述】:

我正在尝试单击使用 selenium 的表内的链接。这是我的代码:

element = WebDriverWait(driver, 30).until(

    EC.presence_of_element_located((By.XPATH, "/html/body/table/tbody/tr/td/table/tbody/tr[11]/td[3]/a"))
)

element.click()

This is the anchor tag I am trying to click on

我尝试使用其他方法来定位元素,例如通过链接文本、CSS 选择器和类名,但似乎没有任何效果。它似乎无法定位到锚元素。

通过链接文本:By.LINK_TEXT, "Booking"

通过 CSS 选择器:By.CSS_SELECTOR, "body > table > tbody > tr > td > table > tbody > tr:nth-child(11) > td:nth-child(3) > a"

按类名:By.CLASS_NAME, "sidelinkbold"

This is how the website looks like

Full page

<html data-darkreader-mode="dynamic" data-darkreader-scheme="dark"><head><style class="darkreader darkreader--fallback" media="screen"></style><style class="darkreader darkreader--text" media="screen"></style><style class="darkreader darkreader--invert" media="screen">.jfk-bubble.gtx-bubble, .captcheck_answer_label > input + img, span#closed_text > img[src^="https://www.gstatic.com/images/branding/googlelogo"], span[data-href^="https://www.hcaptcha.com/"] > #icon, #bit-notification-bar-iframe, embed[type="application/pdf"] {
    filter: invert(100%) hue-rotate(180deg) brightness(150%) contrast(60%) !important;
}</style><style class="darkreader darkreader--inline" media="screen">[data-darkreader-inline-bgcolor] {
  background-color: var(--darkreader-inline-bgcolor) !important;
}
[data-darkreader-inline-bgimage] {
  background-image: var(--darkreader-inline-bgimage) !important;
}
[data-darkreader-inline-border] {
  border-color: var(--darkreader-inline-border) !important;
}
[data-darkreader-inline-border-bottom] {
  border-bottom-color: var(--darkreader-inline-border-bottom) !important;
}
[data-darkreader-inline-border-left] {
  border-left-color: var(--darkreader-inline-border-left) !important;
}
[data-darkreader-inline-border-right] {
  border-right-color: var(--darkreader-inline-border-right) !important;
}
[data-darkreader-inline-border-top] {
  border-top-color: var(--darkreader-inline-border-top) !important;
}
[data-darkreader-inline-boxshadow] {
  box-shadow: var(--darkreader-inline-boxshadow) !important;
}
[data-darkreader-inline-color] {
  color: var(--darkreader-inline-color) !important;
}
[data-darkreader-inline-fill] {
  fill: var(--darkreader-inline-fill) !important;
}
[data-darkreader-inline-stroke] {
  stroke: var(--darkreader-inline-stroke) !important;
}
[data-darkreader-inline-outline] {
  outline-color: var(--darkreader-inline-outline) !important;
}
[data-darkreader-inline-stopcolor] {
  stop-color: var(--darkreader-inline-stopcolor) !important;
}</style><style class="darkreader darkreader--variables" media="screen">:root {
   --darkreader-neutral-background: #3a3c3d;
   --darkreader-neutral-text: #ffffff;
   --darkreader-selection-background: #2677d9;
   --darkreader-selection-text: #ffffff;
}</style><style class="darkreader darkreader--root-vars" media="screen"></style><script class="darkreader darkreader--proxy">(function injectProxy() {
        document.dispatchEvent(
            new CustomEvent("__darkreader__inlineScriptsAllowed")
        );
        const addRuleDescriptor = Object.getOwnPropertyDescriptor(
            CSSStyleSheet.prototype,
            "addRule"
        );
        const insertRuleDescriptor = Object.getOwnPropertyDescriptor(
            CSSStyleSheet.prototype,
            "insertRule"
        );
        const deleteRuleDescriptor = Object.getOwnPropertyDescriptor(
            CSSStyleSheet.prototype,
            "deleteRule"
        );
        const removeRuleDescriptor = Object.getOwnPropertyDescriptor(
            CSSStyleSheet.prototype,
            "removeRule"
        );
        const shouldWrapDocStyleSheets =
            location.hostname.endsWith("pushbullet.com") ||
            location.hostname.endsWith("ilsole24ore.com") ||
            location.hostname.endsWith("allegro.pl");
        const documentStyleSheetsDescriptor = shouldWrapDocStyleSheets
            ? Object.getOwnPropertyDescriptor(Document.prototype, "styleSheets")
            : null;
        const cleanUp = () => {
            Object.defineProperty(
                CSSStyleSheet.prototype,
                "addRule",
                addRuleDescriptor
            );
            Object.defineProperty(
                CSSStyleSheet.prototype,
                "insertRule",
                insertRuleDescriptor
            );
            Object.defineProperty(
                CSSStyleSheet.prototype,
                "deleteRule",
                deleteRuleDescriptor
            );
            Object.defineProperty(
                CSSStyleSheet.prototype,
                "removeRule",
                removeRuleDescriptor
            );
            document.removeEventListener("__darkreader__cleanUp", cleanUp);
            document.removeEventListener(
                "__darkreader__addUndefinedResolver",
                addUndefinedResolver
            );
            if (shouldWrapDocStyleSheets) {
                Object.defineProperty(
                    Document.prototype,
                    "styleSheets",
                    documentStyleSheetsDescriptor
                );
            }
        };
        const addUndefinedResolver = (e) => {
            customElements.whenDefined(e.detail.tag).then(() => {
                document.dispatchEvent(
                    new CustomEvent("__darkreader__isDefined", {
                        detail: {tag: e.detail.tag}
                    })
                );
            });
        };
        document.addEventListener("__darkreader__cleanUp", cleanUp);
        document.addEventListener(
            "__darkreader__addUndefinedResolver",
            addUndefinedResolver
        );
        const updateSheetEvent = new Event("__darkreader__updateSheet");
        function proxyAddRule(selector, style, index) {
            addRuleDescriptor.value.call(this, selector, style, index);
            if (
                this.ownerNode &&
                !this.ownerNode.classList.contains("darkreader")
            ) {
                this.ownerNode.dispatchEvent(updateSheetEvent);
            }
            return -1;
        }
        function proxyInsertRule(rule, index) {
            const returnValue = insertRuleDescriptor.value.call(
                this,
                rule,
                index
            );
            if (
                this.ownerNode &&
                !this.ownerNode.classList.contains("darkreader")
            ) {
                this.ownerNode.dispatchEvent(updateSheetEvent);
            }
            return returnValue;
        }
        function proxyDeleteRule(index) {
            deleteRuleDescriptor.value.call(this, index);
            if (
                this.ownerNode &&
                !this.ownerNode.classList.contains("darkreader")
            ) {
                this.ownerNode.dispatchEvent(updateSheetEvent);
            }
        }
        function proxyRemoveRule(index) {
            removeRuleDescriptor.value.call(this, index);
            if (
                this.ownerNode &&
                !this.ownerNode.classList.contains("darkreader")
            ) {
                this.ownerNode.dispatchEvent(updateSheetEvent);
            }
        }
        function proxyDocumentStyleSheets() {
            const docSheets = documentStyleSheetsDescriptor.get.call(this);
            const filtered = [...docSheets].filter((styleSheet) => {
                return !styleSheet.ownerNode.classList.contains("darkreader");
            });
            return Object.setPrototypeOf(filtered, StyleSheetList.prototype);
        }
        Object.defineProperty(
            CSSStyleSheet.prototype,
            "addRule",
            Object.assign({}, addRuleDescriptor, {value: proxyAddRule})
        );
        Object.defineProperty(
            CSSStyleSheet.prototype,
            "insertRule",
            Object.assign({}, insertRuleDescriptor, {value: proxyInsertRule})
        );
        Object.defineProperty(
            CSSStyleSheet.prototype,
            "deleteRule",
            Object.assign({}, deleteRuleDescriptor, {value: proxyDeleteRule})
        );
        Object.defineProperty(
            CSSStyleSheet.prototype,
            "removeRule",
            Object.assign({}, removeRuleDescriptor, {value: proxyRemoveRule})
        );
        if (shouldWrapDocStyleSheets) {
            Object.defineProperty(
                Document.prototype,
                "styleSheets",
                Object.assign({}, documentStyleSheetsDescriptor, {
                    get: proxyDocumentStyleSheets
                })
            );
        }
    })()</script><style class="darkreader darkreader--user-agent" media="screen">input, textarea, select, button {
    background-color: #3f4243;
}
html, body, input, textarea, select, button {
    border-color: #9f9789;
    color: #ffffff;
}
a {
    color: #5cbeff;
}
table {
    border-color: #7e8689;
}
::placeholder {
    color: #e1dacf;
}
input:-webkit-autofill,
textarea:-webkit-autofill,
select:-webkit-autofill {
    background-color: #7f8626 !important;
    color: #ffffff !important;
}
::-webkit-scrollbar {
    background-color: #484b4c;
    color: #dad2c7;
}
::-webkit-scrollbar-thumb {
    background-color: #6f7477;
}
::-webkit-scrollbar-thumb:hover {
    background-color: #82898d;
}
::-webkit-scrollbar-thumb:active {
    background-color: #72787b;
}
::-webkit-scrollbar-corner {
    background-color: #3f4243;
}
::selection {
    background-color: #2677d9 !important;
    color: #ffffff !important;
}
::-moz-selection {
    background-color: #2677d9 !important;
    color: #ffffff !important;
}</style><script language="JavaScript">
// Create account variable
var var_acct;
// --

var_acct = 925479
 //document.write(var_acct);
 
</script>

 
<title>BBDC: Side Navigation</title> 
<link rel="stylesheet" href="../css/content.css" type="text/css"><style class="darkreader darkreader--sync" media="screen"></style>
<script language="javascript" src="../admin/inc-script/common.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta http-equiv="expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta name="darkreader" content="b042933e61e724920d01151a5694719f"><style class="darkreader darkreader--override" media="screen">.vimvixen-hint {
    background-color: #a87e0f !important;
    border-color: #ffdf3a !important;
    color: #fffff8 !important;
}
::placeholder {
    opacity: 0.5 !important;
}
a[href="https://coinmarketcap.com/"] > svg[width="94"][height="16"] > path {
    fill: var(--darkreader-neutral-text) !important;
}
#edge-translate-panel-body {
    color: var(--darkreader-neutral-text) !important;
}</style></head>

<body class="sidetxtbold" marginwidth="5" marginheight="5" topmargin="5" leftmargin="5" background="">
<!-- Begin Enrolment Process --> 
<table width="150" border="0" cellspacing="0" cellpadding="0" bgcolor="#CCCCCC" data-darkreader-inline-bgcolor="" style="--darkreader-inline-bgcolor:#5e6264;">
    <tbody><tr><!--<td><img src="../image/invis.gif" width="5" height="1"></td>-->
    <td width="100%">
        <table class="sidetxtbold" width="100%" border="0" cellspacing="0" cellpadding="0">     
        <tbody><tr valign="top">
            <td></td>   
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
                <td colspan="2"><a href="../b-default.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Home'; return true" onmouseout="window.status=' '; return true">Home</a></td>
        </tr>
         
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-3c-branchNvenues.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Branch and Venues'; return true" onmouseout="window.status=' '; return true">Branch and Venues</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
       
       <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
                <td class="sidetxtbold" colspan="2"><a href="../a-PayNow.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Home'; return true" onmouseout="window.status=' '; return true"><font color="red" data-darkreader-inline-color="" style="--darkreader-inline-color:#ff4242;">PayNow Topup</font></a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
       
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-ShowPPL.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='PPL Book'; return true" onmouseout="window.status=' '; return true">Practical Training HandBook</a></td>
        </tr>
        
            <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
            <!--
            <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
                <td class="sidetxtbold" colspan="2"><A HREF="../b-updatePDLExpiryDate.asp" class="sidelinkbold" target="mainFrame" onMouseOver=" window.status='Home'; return true" onMouseOut="window.status=' '; return true">PDL Expiry Date Update</a></td>
        </tr>
    
        
    
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        -->
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td class="sidetxtbold" colspan="2" onmouseover="window.status='Practical Training'" onmouseout="window.status=' '">TP Simulator</td>
        </tr>
            
            <tr valign="top">
                <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-selectTPDSModule.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Booking'; return true" onmouseout="window.status=' '; return true">Booking</a></td>
        </tr>
    
    <tr valign="top">
                <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-tpds-LessonCancel.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Booking'; return true" onmouseout="window.status=' '; return true">Cancel</a></td>
        </tr>
        
            <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <!-- ended 05112009 -->
        

        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td class="sidetxtbold" colspan="2" onmouseover="window.status='Theory Training'" onmouseout="window.status=' '">Theory Training</td>
        </tr>
        
            
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
    
            
                <td width="100%"><a href="../b-selectTheory.asp?action=book" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Theory Training Booking'; return true" onmouseout="window.status=' '; return true">Booking</a></td>
            

        </tr>
        
        
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <td class="sidetxtbold" width="100%"><a href="../b-selectTheory.asp?action=cancel" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Theory Training Cancel'; return true" onmouseout="window.status=' '; return true">Cancel</a></td>
        </tr>
        <tr>
            <td class="sidetxtbold" colspan="3">&nbsp;</td>
        </tr>
        
       
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td class="sidetxtbold" colspan="2" onmouseover="window.status='Practical Test'" onmouseout="window.status=' '">Practical Test</td>
        </tr>
        
            
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <!--
            <td width="100%"><a href="../b-3c-practicalTestBooking.asp?+3" class="sidelinkbold" target="mainFrame" onMouseOver=" window.status='Practical Test Booking'; return true" onMouseOut="window.status=' '; return true">Booking</a></td>
            -->
            <td class="sidetxtbold" width="100%"><a href="../s-bookTermMain.asp?fname=b%2D3c%2DSelectPracticalTestBooking%2Easp%3F%2B3" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Practical Test Booking'; return true" onmouseout="window.status=' '; return true">Booking</a></td>
        </tr>
        
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <td width="100%"><a href="../b-3c-practicalTestCancel.asp?limit=pt" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Practical Test Cancel'; return true" onmouseout="window.status=' '; return true">Cancel</a></td>
        </tr>
        
        
        
        
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td class="sidetxtbold" colspan="2" onmouseover="window.status='Theory Test'" onmouseout="window.status=' '">Theory Test</td>
        </tr>
            
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <!--
            <td width="100%"><a href="../b-selectTest.asp?action=book" class="sidelinkbold" target="mainFrame" onMouseOver=" window.status='Theory Test Booking'; return true" onMouseOut="window.status=' '; return true">Booking</a></td>
            -->
            <td width="100%"><a href="../s-bookTermMain.asp?fname=b%2DselectTest%2Easp%3Faction%3Dbook" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Theory Test Booking'; return true" onmouseout="window.status=' '; return true">Booking</a></td>
        </tr>
        
        <tr valign="top">
            <td>&nbsp;</td>
            <td><img src="../image/site/icn-arrow-blue.gif">&nbsp;</td>
            <td width="100%"><a href="../b-selectTest.asp?action=cancel" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Theory Test Cancel'; return true" onmouseout="window.status=' '; return true">Cancel</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
      
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-trainSchedule&amp;His.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Training &amp; Test History'; return true" onmouseout="window.status=' '; return true">Training &amp; Test History</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-bookTestStatement.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Booking Statement'; return true" onmouseout="window.status=' '; return true">Booking <br>Statement</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-accountTransactions.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Account Transaction'; return true" onmouseout="window.status=' '; return true">Account <br>Transaction</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        
        
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-membershipRenewal.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Membership Renewal'; return true" onmouseout="window.status=' '; return true">Membership Renewal</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>       
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-transferFund.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Transfer Fund'; return true" onmouseout="window.status=' '; return true">Transfer Fund</a></td>
        </tr>       
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-changePassword.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Change Password'; return true" onmouseout="window.status=' '; return true">Change Password</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
            <td colspan="2"><a href="../b-updateProfile.asp" class="sidelinkbold" target="mainFrame" onmouseover=" window.status='Update Profile'; return true" onmouseout="window.status=' '; return true">Update Profile</a></td>
        </tr>       
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>  
        
        
            
        
        <tr valign="top">
            <td><img src="../image/site/icn-4dot.gif">&nbsp;</td>
                <td colspan="2"><a href="#" onclick="logout('../b-logoutleonnew.asp');" class="sidelinkbold" onmouseover=" window.status='Logout'; return true" onmouseout="window.status=' '; return true">Logout</a></td>
        </tr>
        <tr>
            <td colspan="3">&nbsp;</td>
        </tr>
        </tbody></table>
    </td>
    </tr>
</tbody></table>
<!--<SCRIPT LANGUAGE=JAVASCRIPT SRC="../admin/inc-script/DisableRightMouseClick.js"></SCRIPT>-->

</body></html>

【问题讨论】:

  • 你有什么错误吗?
  • 如果您分享指向该网页的链接并提及您要点击的确切元素会更好
  • 显示最后一个 tr 里面的内容
  • 什么是异常堆栈跟踪?
  • @itronic1990 我确实有这个错误:[22760:17024:0603/231645.559:ERROR:device_event_log_impl.cc(214)] [23:16:45.559] USB:usb_device_handle_win.cc:1054 失败从节点连接读取描述符:连接到系统的设备无法正常工作。 (0x1F) [22760:17024:0603/231645.563:ERROR:device_event_log_impl.cc(214)] [23:16:45.563] 蓝牙:bluetooth_adapter_winrt.cc:1072 获取默认适配器失败。

标签: python selenium


【解决方案1】:

试试这个:

element = WebDriverWait(driver, 30).until(

    EC.presence_of_element_located((By.XPATH, "//a[contains(text(),'Booking')]"))
)

element.click()

【讨论】:

  • 感谢您的回复,但它似乎仍然不起作用。有一些带有文本“预订”的锚标签,但我试图访问的是第一个这样的元素,所以我不确定为什么它无法找到它或任何相关的东西。我在帖子中添加了整页。
  • 您添加了一张图片。你能看到那里的元素属性吗?我没有。
  • 更新:如果有帮助,我添加了整个 html 元素的代码。
  • 我明白了。你到那里有什么错误?您是否必须滚动才能看到该元素,或者它最初位于页面视图中?
  • 没有错误。代码之后什么都没有发生。无需滚动即可看到整个页面在加载时可见的元素。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多