如何从样式属性设置为“display:none;”的div标签中提取文本?通过硒

时间:2018-04-08 03:08:47

标签: python-3.x selenium selenium-webdriver webdriver display

我的HTML看起来像这样:

<div class="row">
    <div class="col-md-7">
        <ul class="breadcrumb">
            <li id="get_data"><a href="#">Get data</a></li>
            <li id="sampling_task"><a href="#">Sampling</a></li>
            <li id="confirm_task"><a href="#">Confirmation</a></li>
        </ul>

        <div class="container-fluid">
            <form action="#" method="post" enctype="multipart/form-data" role="form" class="form-horizontal">
                {% csrf_token %}
                <div class="form-group">
                    <label for="id_fileA" class="col-sm-3 control-label" style="text-align: left">
                        Select dataset A<span class='required_label'>*</span>
                    </label>
                    <div class="col-sm-9">
                        {{ form.fileA|attr:"class:form-control" }}
                    </div>
                </div>

                <div class="form-group"></div>

                <div class="form-group">
                    <label for="id_fileB" class="col-sm-3 control-label" style="text-align: left">
                        Select dataset B<span class='required_label'>*</span>
                    </label>
                    <div class="col-sm-9">
                        {{ form.fileB|attr:"class:form-control" }}
                    </div>
                </div>

                <div class="form-group"></div>

                <div class="form-group" id="sample_btn" style="display: none">
                    <label class="col-sm-3 control-label"></label>
                    <div class="col-sm-9">
                        <input type="button" name="theButton" id="sample-step" value="Start Sampling" class="btn btn-success btn-large disabled" style="border-radius: 5px;">
                    </div>
                </div>

                <div class="form-group">
                    <div class="col-sm-9 col-sm-offset-3" id="sample_msg" style="display: none;">
                        <p id="sample_text" style="font-size: medium">
                            Some ABCD message
                        </p>
                    </div>
                </div>

                <div class="form-group">
                    <div class="col-sm-9 col-sm-offset-3" id="get_sample_confirm_msg" style="display: none;">
                        <p>
                        <input type="button" style="height: 40px; width: 140px; border-radius: 5px" name="YesButton" id="accept-step" value="Accept & Continue" class="btn btn-success disabled">
                        <input type="button" style="height: 40px; width: 140px; border-radius: 5px" name="NoButton" id="cancel-step" value="Cancel Sampling" class="btn btn-danger disabled">
                        </p>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="col-md-5">
    </div>
</div>

后端是一个javascript,按下按钮,它会进行处理,如果出现问题,javascript代码会更新消息。

var error = "<div class='alert alert-danger'><p>We encountered an error while sampling: <br /><strong>Sampling failed!!</strong></p>"; error += "<p>Please <a href='mailto:abcd@gmail.com'>contact us</a> if this error persists.</p>";
error += "</div>";
$('#sample_msg').html(error);

现在,在我的硒代码中,如果我这样做:

sample_msg = self.driver.find_element_by_id('sample_msg')

我得到一个空列表结果。我想要的是读取“sample_msg”类中的错误,如果有的话,我已经尝试了一些东西,但它没有成功。感谢帮助。感谢。

3 个答案:

答案 0 :(得分:1)

如果您想访问隐藏文本,可能需要使用以下代码:

sample_msg = self.driver.find_element_by_id('sample_msg').get_attribute('textContent').strip()

请注意,text属性仅允许从可见元素中获取文本

答案 1 :(得分:0)

当您尝试提取错误消息某些ABCD消息时,它包含在<p>标记中,该标记具有带有样式的父<div>标记属性设置为 display:none; 。因此,要提取文本,您可以使用以下代码块:

element = driver.find_element_by_xpath("//div[@class='form-group']/div[@id='sample_msg']")
driver.execute_script("arguments[0].removeAttribute('style')", element)
print(driver.find_element_by_xpath("//div[@class='form-group']/div[@id='sample_msg']/p").get_attribute("innerHTML"))

答案 2 :(得分:0)

因此,您必须在单击按钮后等待一段时间,一旦出现某条消息,您需要提取该消息。 请尝试以下方法: -

WebDriverWait wait = new WebDriverWait(webDriver,timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id)); 或

wait.until(ExpectedConditions.elementToBeClickable(By.id)); 确切地说。

另见:

org.openqa.selenium.support.ui.ExpectedConditions用于各种等待场景的类似快捷方式。 org.openqa.selenium.support.ui.WebDriverWait为其各种构造函数。

您也可以在上面的链接中查看python语法。